我想在我的下一個Web項目中使用Shiro,但我不知道如何管理用戶(shiro.ini中的[用戶])的策略(如果不是最好的話)。Apache Shiro:你將如何管理用戶?
- 最好是爲每個註冊會員創建Shiro用戶嗎?
- 或者創建一個Shiro用戶,然後爲每個成員將它存儲到某個數據庫並通過Shiro用戶訪問它?
如果你要去#1,你會如何管理/自動化它?我工作的大多數項目都選擇了#2。
感謝
我想在我的下一個Web項目中使用Shiro,但我不知道如何管理用戶(shiro.ini中的[用戶])的策略(如果不是最好的話)。Apache Shiro:你將如何管理用戶?
如果你要去#1,你會如何管理/自動化它?我工作的大多數項目都選擇了#2。
感謝
您可以使用Stormpath作爲您的用戶/羣組商店。通過完整的管理用戶界面和Java SDK,在Shiro integration和繁榮 - 即時用戶/組數據存儲中爲啓用Shiro的應用程序提供支持。
它甚至可以幫助自動化諸如'忘記密碼'的電子郵件和帳戶電子郵件驗證等內容。它也適用於很多用途。作爲一個例子,你可以看到Shiro sample app using Stormpath。
Shiro提供了多種方式來配置用戶。看看可能的Realm配置here。
如果這些都不滿足您的需求,您甚至可以爲您的應用程序編寫自定義Realm,例如可以從NoSQL數據庫中提取用戶信息,或從SAML響應中獲取信息,或者使用OAuth2。絕對不建議在生產中的shiro.ini中創建任何用戶詳細信息。爲了給出自定義域可能的外觀概念,下面是一個例子,我創建了一個基於SAML2的用戶認證和授權:shiro-saml2。
PLease不要只爲每個人使用一個用戶。避免這個選項。 更好地使用每個用戶的一個用戶(帳戶)。
在shiro中,您可以擁有RDMS Realm,它允許您使用簡單的數據庫(如mysql)來存儲您的用戶/帳戶/權限。 :)
克隆這個項目,(這不是我的),並在1分鐘開始! :) shiro/mysql GIT example 享受它:)
Shiro提供實現自己的領域根據您的要求。
創建一個簡單的領域,您可以在其中管理詳細信息,登錄名,權限和角色。 您可以使用jdbc,Hibernate或任何其他身份驗證方式來管理它們。
將此領域配置爲您的ini或您在項目中使用的任何方式。
現在Shiro會自動調用您的領域類的方法來查找憑據,權限,角色。
因爲我有一個shiro hibernate realm我用我的hibernate代碼來管理我的db中的用戶。
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
/**
* @author Ankit
*
*/
public class PortalHibernateRealm extends AuthorizingRealm {
private static final Logger LOGGER = new Logger(
PortalHibernateRealm.class.toString());
/**
*
*/
public PortalHibernateRealm() {
super();
/*
* Set credential matcher on object creation
*/
setCredentialsMatcher(new CredentialsMatcher() {
@Override
public boolean doCredentialsMatch(AuthenticationToken arg0,
AuthenticationInfo arg1) {
UsernamePasswordToken token = (UsernamePasswordToken) arg0;
String username = token.getUsername();
String password = new String(token.getPassword());
/*
Check for credential and return true if found valid else false
*/
return false;
}
});
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principalCollection) {
Collection<String> permissionSet;
SimpleAuthorizationInfo info = null;
Long userId = (Long) principalCollection.getPrimaryPrincipal();
//Using thi principle create SimpleAuthorizationInfo and provide permissions and roles
info = new SimpleAuthorizationInfo();
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
/*using this token create a SimpleAuthenticationInfo like
User user = UserUtil.findByEmail(token.getUsername());
*/
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
primaryPrin, Password, screenName);
return authenticationInfo;
}
}