SpringBoot+shiro整合學習之登入認證和許可權控制
阿新 • • 發佈:2020-10-22
SpringBoot+shiro教程
http://z77z.oschina.io/2017/02/13/SpringBoot+shiro%E6%95%B4%E5%90%88%E5%AD%A6%E4%B9%A0%E4%B9%8B%E7%99%BB%E5%BD%95%E8%AE%A4%E8%AF%81%E5%92%8C%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6/
shiro完整教程
http://wiki.jikexueyuan.com/project/shiro/
身份認證流程
流程如下:
- 首先呼叫 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*
ModularRealmAuthorizer 進行多 Realm 匹配流程:
- 首先檢查相應的 Realm 是否實現了實現了 Authorizer;
- 如果實現了 Authorizer,那麼接著呼叫其相應的
isPermitted*/hasRole*
介面進行匹配; - 如果有一個 Realm 匹配那麼將返回 true,否則返回 false。
如果 Realm 進行授權的話,應該繼承 AuthorizingRealm,其流程是:
- 如果呼叫
hasRole*
,則直接獲取 AuthorizationInfo.getRoles() 與傳入的角色比較即可;首先如果呼叫如 isPermitted(“user:view”),首先通過 PermissionResolver 將許可權字串轉換成相應的 Permission 例項,預設使用 WildcardPermissionResolver,即轉換為萬用字元的 WildcardPermission; - 通過 AuthorizationInfo.getObjectPermissions() 得到 Permission 例項集合;通過 AuthorizationInfo.getStringPermissions() 得到字串集合並通過 PermissionResolver 解析為 Permission 例項;然後獲取使用者的角色,並通過 RolePermissionResolver 解析角色對應的許可權集合(預設沒有實現,可以自己提供);
- 接著呼叫 Permission.implies(Permission p) 逐個與傳入的許可權比較,如果有匹配的則返回 true,否則 false。
轉載於:https://my.oschina.net/ffse54s/blog/1802039