Apache Shiro 使用手冊(四)Realm 實現

在認證、授權內部實現機制中都有提到,最終處理都將交給Real進行處理。因爲在Shiro中,最終是通過Realm來獲取應用程序中的用戶、角色及權限信息的。通常情況下,在Realm中會直接從我們的數據源中獲取Shiro需要的驗證信息。可以說,Realm是專用於安全框架的DAO.

一、認證實現
正如前文所提到的,Shiro的認證過程最終會交由Realm執行,這時會調用Realm的getAuthenticationInfo(token)方法。
該方法主要執行以下操作:
1、檢查提交的進行認證的令牌信息
2、根據令牌信息從數據源(通常爲數據庫)中獲取用戶信息
3、對用戶信息進行匹配驗證。
4、驗證通過將返回一個封裝了用戶信息的AuthenticationInfo實例。
5、驗證失敗則拋出AuthenticationException異常信息。

而在我們的應用程序中要做的就是自定義一個Realm類,繼承AuthorizingRealm抽象類,重載doGetAuthenticationInfo (),重寫獲取用戶信息的方法。
Java代碼  收藏代碼
  1. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {  
  2.         UsernamePasswordToken token = (UsernamePasswordToken) authcToken;  
  3.         User user = accountManager.findUserByUserName(token.getUsername());  
  4.         if (user != null) {  
  5.             return new SimpleAuthenticationInfo(user.getUserName(), user.getPassword(), getName());  
  6.         } else {  
  7.             return null;  
  8.         }  
  9. }  

二、授權實現
而授權實現則與認證實現非常相似,在我們自定義的Realm中,重載doGetAuthorizationInfo()方法,重寫獲取用戶權限的方法即可。
Java代碼  收藏代碼
  1. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  2.         String userName = (String) principals.fromRealm(getName()).iterator().next();  
  3.         User user = accountManager.findUserByUserName(userName);  
  4.         if (user != null) {  
  5.             SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
  6.             for (Group group : user.getGroupList()) {  
  7.                 info.addStringPermissions(group.getPermissionList());  
  8.             }  
  9.             return info;  
  10.         } else {  
  11.             return null;  
  12.         }  


原文鏈接:http://kdboy.iteye.com/blog/1169631

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章