1. 程式人生 > 實用技巧 >SpringBoot+shiro整合學習之登入認證和許可權控制

SpringBoot+shiro整合學習之登入認證和許可權控制

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

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/

身份認證流程

流程如下:

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

授權流程

流程如下:

  1. 首先呼叫Subject.isPermitted*/hasRole*介面,其會委託給 SecurityManager,而 SecurityManager 接著會委託給 Authorizer;
  2. Authorizer 是真正的授權者,如果我們呼叫如 isPermitted(“user:view”),其首先會通過 PermissionResolver 把字串轉換成相應的 Permission 例項;
  3. 在進行授權之前,其會呼叫相應的 Realm 獲取 Subject 相應的角色/許可權用於匹配傳入的角色/許可權;
  4. Authorizer 會判斷 Realm 的角色/許可權是否和傳入的匹配,如果有多個 Realm,會委託給 ModularRealmAuthorizer 進行迴圈判斷,如果匹配如isPermitted*/hasRole*
    會返回 true,否則返回 false 表示授權失敗。

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