首頁  >  文章  >  後端開發  >  Apache Shiro 使用手冊(四)Realm 實現

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

黄舟
黄舟原創
2017-01-18 09:32:381265瀏覽

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)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn