Shiro学习之Shiro授权的内部处理机制(六)
1、在應用程序中調(diào)用授權(quán)驗證方法(Subject的isPermitted*或hasRole*等)
2、Sbuject的實例通常是DelegatingSubject類(或子類)的實例對象,在認證開始時,會委托應用程序設置的securityManager實例調(diào)用相應的isPermitted*或hasRole*方法。
3、接下來SecurityManager會委托內(nèi)置的Authorizer的實例(默認是ModularRealmAuthorizer 類的實例,類似認證實例,它同樣支持一個或多個Realm實例認證)調(diào)用相應的授權(quán)方法。
4、每一個Realm將檢查是否實現(xiàn)了相同的 Authorizer 接口。然后,將調(diào)用Reaml自己的相應的授權(quán)驗證方法。
當使用多個Realm時,不同于認證策略處理方式,授權(quán)處理過程中:
1、當調(diào)用Realm出現(xiàn)異常時,將立即拋出異常,結(jié)束授權(quán)驗證。
2、只要有一個Realm驗證成功,那么將認為授權(quán)成功,立即返回,結(jié)束認證。
Shiro的Realm實現(xiàn)
在認證、授權(quán)內(nèi)部實現(xiàn)機制中都有提到,最終處理都將交給Real進行處理。因為在Shiro中,最終是通過Realm來獲取應用程序中的用戶、角色及權(quán)限信息的。通常情況下,在Realm中會直接從我們的數(shù)據(jù)源中獲取Shiro需要的驗證信息。可以說,Realm是專用于安全框架的DAO.
一、認證實現(xiàn)
正如前文所提到的,Shiro的認證過程最終會交由Realm執(zhí)行,這時會調(diào)用Realm的getAuthenticationInfo(token)方法。
該方法主要執(zhí)行以下操作:
1、檢查提交的進行認證的令牌信息
2、根據(jù)令牌信息從數(shù)據(jù)源(通常為數(shù)據(jù)庫)中獲取用戶信息
3、對用戶信息進行匹配驗證。
4、驗證通過將返回一個封裝了用戶信息的AuthenticationInfo實例。
5、驗證失敗則拋出AuthenticationException異常信息。
而在我們的應用程序中要做的就是自定義一個Realm類,繼承AuthorizingRealm抽象類,重載doGetAuthenticationInfo (),重寫獲取用戶信息的方法。
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; User user = accountManager.findUserByUserName(token.getUsername()); if (user != null) { return new SimpleAuthenticationInfo(user.getUserName(), user.getPassword(), getName()); } else { return null; } }二、授權(quán)實現(xiàn)
而授權(quán)實現(xiàn)則與認證實現(xiàn)非常相似,在我們自定義的Realm中,重載doGetAuthorizationInfo()方法,重寫獲取用戶權(quán)限的方法即可。
總結(jié)
以上是生活随笔為你收集整理的Shiro学习之Shiro授权的内部处理机制(六)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt的小技巧
- 下一篇: vmware workstation虚拟