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 (),重寫獲取使用者資訊的方法。
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; } }
二、授權實作
而授權實作則與認證實作非常相似,在我們自訂的Realm中,重載doGetAuthorizationInfo()方法,重寫取得使用者權限的方法即可。
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String userName = (String) principals.fromRealm(getName()).iterator().next(); User user = accountManager.findUserByUserName(userName); if (user != null) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (Group group : user.getGroupList()) { info.addStringPermissions(group.getPermissionList()); } return info; } else { return null; } }
以上是Apache Shiro 使用手冊(四)Realm 實現的內容,更多相關內容請關注PHP中文網(www.php.cn)!