再見Spring Security!推薦一款功能強大的權限認證框架


在我們做SpringBoot項目的時候,認證授權是必不可少的功能!我們經常會選擇Shiro、Spring Security這類權限認證框架來實現,但這些框架使用起來有點繁瑣,而且功能也不夠強大。最近發現一款功能強大的權限認證框架Sa-Token,它使用簡單、API設計優雅,推薦給大家!

Sa-Token簡介

Sa-Token是一款輕量級的Java權限認證框架,可以用來解決登錄認證、權限認證、Session會話、單點登錄、OAuth2.0、微服務網關鑒權等一系列權限相關問題。

框架集成簡單、開箱即用、API設計優雅,通過Sa-Token,你將以一種極其簡單的方式實現系統的權限認證部分,有時候往往只需一行代碼就能實現功能。

Sa-Token功能很全,具體可以參考下圖。

再見Spring Security!推薦一款功能強大的權限認證框架

 

使用

在SpringBoot中使用Sa-Token是非常簡單的,接下來我們使用它來實現最常用的認證授權功能,包括登錄認證、角色認證和權限認證。

集成及配置

Sa-Token的集成和配置都非常簡單,不愧為開箱即用。

  • 首先我們需要在項目的pom.xml中添加Sa-Token的相關依賴;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 然后在application.yml中添加Sa-Token的相關配置,考慮到要支持前后端分離項目,我們關閉從cookie中讀取token,改為從head中讀取token。
再見Spring Security!推薦一款功能強大的權限認證框架

 

登錄認證

在管理系統中,除了登錄接口,基本都需要登錄認證,在Sa-Token中使用路由攔截鑒權是最方便的,下面我們來實現下。

  • 實現登錄認證非常簡單,首先在UmsAdminController中添加一個登錄接口;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 然后在UmsAdminServiceImpl添加登錄的具體邏輯,先驗證密碼,然后調用StpUtil.login(adminUser.getId())即可實現登錄,調用API一行搞定;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 我們再添加一個測試接口用於查詢當前登錄狀態,返回true表示已經登錄;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 之后可以通過Swagger訪問登錄接口來獲取Token了,使用賬號為admin:123456,訪問地址:http://localhost:8088/swagger-ui/
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 然后在Authorization請求頭中添加獲取到的token;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 訪問/admin/isLogin接口,data屬性就會返回true了,表示你已經是登錄狀態了;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 接下來我們需要把除登錄接口以外的接口都添加登錄認證,添加Sa-Token的Java配置類SaTokenConfig,注冊一個路由攔截器SaRouteInterceptor,這里我們的IgnoreUrlsConfig配置會從配置文件中讀取白名單配置;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • application.yml文件中的白名單配置如下,注意開放Swagger的訪問路徑和靜態資源路徑;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 由於未登錄狀態下訪問接口,Sa-Token會拋出NotLoginException異常,所以我們需要全局處理下;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 之后當我們在登錄狀態下訪問接口時,可以獲取到數據;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 當我們未登錄狀態(不帶token)時無法正常訪問接口,返回code為401。
再見Spring Security!推薦一款功能強大的權限認證框架

 

角色認證

角色認證也就是我們定義好一套規則,比如ROLE-ADMIN角色可以訪問/brand下的所有資源,而ROLE_USER角色只能訪問/brand/listAll,接下來我們來實現下角色認證。

  • 首先我們需要擴展Sa-Token的StpInterface接口,通過實現方法來返回用戶的角色碼和權限碼;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 然后在Sa-Token的攔截器中配置路由規則,ROLE_ADMIN角色可以訪問所有路徑,而ROLE_USER只能訪問/brand/listAll路徑;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 當用戶不是被允許的角色訪問時,Sa-Token會拋出NotRoleException異常,我們可以全局處理下;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 我們現在有兩個用戶,admin用戶具有ROLE_ADMIN角色,macro用戶具有ROLE_USER角色;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 使用admin賬號訪問/brand/list接口可以正常訪問;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 使用macro賬號訪問/brand/list接口無法正常訪問,返回code為403。
再見Spring Security!推薦一款功能強大的權限認證框架

 

權限認證

當我們給角色分配好權限,然后給用戶分配好角色后,用戶就擁有了這些權限。我們可以為每個接口分配不同的權限,擁有該權限的用戶就可以訪問該接口。這就是權限認證,接下來我們來實現下它。

  • 我們可以在Sa-Token的攔截器中配置路由規則,admin用戶可以訪問所有路徑,而macro用戶只有讀取的權限,沒有寫、改、刪的權限;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 當用戶無權限訪問時,Sa-Token會拋出NotPermissionException異常,我們可以全局處理下;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 使用admin賬號訪問/brand/delete接口可以正常訪問;
再見Spring Security!推薦一款功能強大的權限認證框架

 

  • 使用macro賬號訪問/brand/delete無法正常訪問,返回code為403。
再見Spring Security!推薦一款功能強大的權限認證框架

 

總結

通過對Sa-Token的一波實踐,我們可以發現它的API設計非常優雅,比起Shiro和Spring Security來說確實順手多了。Sa-Token不僅提供了一系列強大的權限相關功能,還提供了很多標准的解決方案,比如Oauth2、分布式Session會話等,大家感興趣的話可以研究下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM