Shiro+JWT 實現權限管理(一)--Shiro


在之前的文章《權限框架Apache Shiro 和 Spring Security》中有介紹一些權限框架,當時覺得Shiro功能比較強大,也比較適合管理后台不同粒度的權限控制.

再后來的工作過程中,發現了shiro的一些不足之處--對於多端登錄支持不是很友好,需要自己去實現具體功能.

經過搜索、研究發現一個新東西--JWT (JAVA WEB TOKEN),為了在網絡應用環境聲明而執行的一種基於 JSON 的開放標准.這玩意特別適用於分布式站點的單點登錄.至於為什么選用Token,可以看下這篇文章《shiro使用(使用token預熱,為什么要使用token)》

在大致研究了JWT功能后,決定對之前寫的權限管理做一些優化--使用JWT做認證,配合Shrio強大的授權功能,實現更加全面、輕量化的權限管理.

之前那篇文章只寫了各框架的對比,並沒有詳細的介紹.正好寫篇文章介紹一下Shiro .But 該文只做概念介紹后面再做貼出代碼吧.

 

Shiro

官方文檔地址:http://shiro.apache.org/architecture.html

Shiro核心架構概念  

 

介紹一下shiro需要關注的幾個概念

SecurityManager  shiro框架的核心  shiro通過securityManager來管理內部主鍵實例,並通過它來提供安全管理的各種服務.

Subject  當前操作用戶--請求主體  在程序中任何地方都可以使用SecurityUtils.getSubjcet()獲取當前的subject   然后利用subject.getPrincipal()獲取principal--subject的標示,程序通過principal來識別唯一用戶,可以是定義的toekn,也可以是用戶id等.

Realms  充當shiro與應用安全數據間的橋梁和連接器,當對用戶執行認證和授權驗證時,shiro會從應用配置的realm中查找用戶及其權限信息. 當有多個realm存在時,shiro在做用戶校驗的時候會按照決策來決定認證是否通過.一個realm對應一個matcher用來做用戶提交認證信息和realm獲取的用戶信息做對比.

Shiro的功能架構圖

Authentication(認證), Authorization(授權), Session Management(會話管理), Cryptography(加密)被稱之為應用安全的四大基石。

Authentication 用戶身份識別、判斷  解決--我是我

Authorization 訪問權限控制  解決--我能做什么

Session Management  會話管理 支持特異性的管理

Cryptography  對數據源進行加密同時保證輕易訪問

還有其他的功能支持不同應用環境下的權限安全控制,可以根據特異需求進行豐富和加強.

 

shiro認證與授權 

參考 https://www.jianshu.com/p/504af828a3ab

認證流程

  • 調用Subject.login(token)進行登錄,其會自動委托給Security Manager,調用之前必須通過SecurityUtils. setSecurityManager()設置;
  • SecurityManager負責真正的身份驗證邏輯;它會委托給Authenticator進行身份驗證;
  • Authenticator才是真正的身份驗證者,Shiro API中核心的身份認證入口點,此處可以自定義插入自己的實現;
  • Authenticator可能會委托給相應的AuthenticationStrategy進行多Realm身份驗證,默認ModularRealmAuthenticator會調用AuthenticationStrategy進行多Realm身份驗證;
  • Authenticator會把相應的token傳入Realm,從Realm獲取身份驗證信息,如果沒有返回/拋出異常表示身份驗證失敗了。此處可以配置多個Realm,將按照相應的順序及策略進行訪問。

授權流程

  • 首先調用Subject.isPermitted*/hasRole*接口,其會委托給SecurityManager,而SecurityManager接着會委托給Authorizer;
  • Authorizer是真正的授權者,如果我們調用如isPermitted(“user:view”),其首先會通過PermissionResolver把字符串轉換成相應的Permission實例;
  • 在進行授權之前,其會調用相應的Realm獲取Subject相應的角色/權限用於匹配傳入的角色/權限;
  • Authorizer會判斷Realm的角色/權限是否和傳入的匹配,如果有多個Realm,會委托給ModularRealmAuthorizer進行循環判斷,如果匹配如isPermitted*/hasRole*會返回true,否則返回false表示授權失敗。

 


免責聲明!

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



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