2013-04-26 79 views
6

我想在我的下一個Web項目中使用Shiro,但我不知道如何管理用戶(shiro.ini中的[用戶])的策略(如果不是最好的話)。Apache Shiro:你將如何管理用戶?

  1. 最好是爲每個註冊會員創建Shiro用戶嗎?
  2. 或者創建一個Shiro用戶,然後爲每個成員將它存儲到某個數據庫並通過Shiro用戶訪問它?

如果你要去#1,你會如何管理/自動化它?我工作的大多數項目都選擇了#2。

感謝

回答

10
  1. 配置用戶shiro.ini是不能用於生產環境的最佳選擇。只有您有少量用戶帳戶時才能使用它,並且您不需要在運行時創建或更改帳戶。它主要用於測試。
  2. 幾乎所有項目都使用一些存儲來保留所有用戶帳戶。它可以是數據庫或一些外部認證引擎,如ldap,cas甚至oauth。
3

您可以使用Stormpath作爲您的用戶/羣組商店。通過完整的管理用戶界面和Java SDK,在Shiro integration和繁榮 - 即時用戶/組數據存儲中爲啓用Shiro的應用程序提供支持。

它甚至可以幫助自動化諸如'忘記密碼'的電子郵件和帳戶電子郵件驗證等內容。它也適用於很多用途。作爲一個例子,你可以看到Shiro sample app using Stormpath

0

Shiro提供了多種方式來配置用戶。看看可能的Realm配置here

如果這些都不滿足您的需求,您甚至可以爲您的應用程序編寫自定義Realm,例如可以從NoSQL數據庫中提取用戶信息,或從SAML響應中獲取信息,或者使用OAuth2。絕對不建議在生產中的shiro.ini中創建任何用戶詳細信息。爲了給出自定義域可能的外觀概念,下面是一個例子,我創建了一個基於SAML2的用戶認證和授權:shiro-saml2

0

PLease不要只爲每個人使用一個用戶。避免這個選項。 更好地使用每個用戶的一個用戶(帳戶)。

在shiro中,您可以擁有RDMS Realm,它允許您使用簡單的數據庫(如mysql)來存儲您的用戶/帳戶/權限。 :)

克隆這個項目,(這不是我的),並在1分鐘開始! :) shiro/mysql GIT example 享受它:)

0

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; 
    } 

}