背景
最近做的項目是前後端分離的,後端主要是springboot,前端是vue,因為角色比較少所以就沒有引入springsecurity,而是單純使用自定義註解和攔截器實現了一個簡單的權限認證。
主要知識點:
1、java自定義註解的使用
2、spring攔截器的使用
3、此示例為簡版權限管理,只有用戶和角色認證,沒有添加url的驗證
實現權限管理,首先要明確權限認證的流程:
下面一個簡單的流程圖
今天分享的內容主要是在3/5/6節點。
註解在Java中應用非常普遍,是從JDK1.5開始提出的,註解也叫元數據,例如我們常見的@Override和@Deprecated,註解是JDK1.5版本開始引入的一個特性,用於對代碼進行說明,可以對包、類、接口、字段、方法參數、局部變量等進行註解。最常見的@Override、@param、@return 等,另外常用的各種框架也都有自己的註解體系,例如學習spring肯定會用到的@Autowired、@Component、@Bean等等。使用註解可以讓我們的代碼非常簡潔和靈活,也很容易理解。
一般常用的註解可以分為三類:
一類是Java自帶的標準註解,包括@Override(標明重寫某個方法)、@Deprecated(標明某個類或方法過時)和@SuppressWarnings(標明要忽略的警告),使用這些註解後編譯器就會進行檢查。
一類為元註解,元註解是用於定義註解的註解,包括@Retention(標明註解被保留的階段)、@Target(標明註解使用的範圍)、@Inherited(標明註解可繼承)、@Documented(標明是否生成javadoc文檔。
一類為自定義註解,可以根據自己的需求定義註解。
本文中我們實現一個自定義註解,可以標明某個方法需要某種權限才可以訪問,代碼如下:
關於Target和Retention:
@Target 表示該註解用於什麼地方。如果不明確指出,該註解可以放在任何地方。以下是一些可用的參數。需要說明的是:屬性的註解是兼容的,如果你想給7個屬性都添加註解,僅僅排除一個屬性,那麼你需要在定義target包含所有的屬性。
ElementType.TYPE:說明該註解只能被聲明在一個類前。
ElementType.FIELD:說明該註解只能被聲明在一個類的字段前。
ElementType.METHOD:說明該註解只能被聲明在一個類的方法前。
ElementType.PARAMETER:說明該註解只能被聲明在一個方法參數前。
ElementType.CONSTRUCTOR:說明該註解只能聲明在一個類的構造方法前。
ElementType.LOCAL_VARIABLE:說明該註解只能聲明在一個局部變量前。
ElementType.ANNOTATION_TYPE:說明該註解只能聲明在一個註解類型前。
ElementType.PACKAGE:說明該註解只能聲明在一個包名前。
@Retention 定義該註解的生命週期。
RetentionPolicy.SOURCE – 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入字節碼。@Override, @SuppressWarnings都屬於這類註解。
RetentionPolicy.CLASS – 在類加載的時候丟棄。在字節碼文件的處理中有用。註解默認使用這種方式。
RetentionPolicy.RUNTIME– 始終不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的信息。我們自定義的註解通常使用這種方式。
枚舉類RoleType如下:
這個是根據自己的業務確定的
另外就是攔截器,因為我後臺用的是springboot,需要使用攔截器攔截請求然後驗證其權限:
控制器的方法上是這個樣子的:
有了以上的內容,就可以實現簡單的權限認證了,另外還需要在用戶登錄的時候將用戶的身份標識放到可以獲取的地方,例如session、redis等。
因為我是前後端分離的,所以測試都是用的postman,這裡就不曬效果了。
如果項目比較複雜,邏輯比較多,建議使用springsecurity等比較完善的框架,本文介紹的只適用於小型系統或自己學習,畢竟系統龐大了,邏輯就複雜的多,如果全靠自己去實現一個權限認證框架,工作量太大而且也不一定靠譜。
有對此感興趣或者有問題的,可以一起聊聊。
閱讀更多 JAVA周老師 的文章