2013-04-26 12 views
6

私は次のWebプロジェクトでShiroを使用したいと思いますが、shiro.iniのユーザー([users])を管理するための最良の方法はわかりません。Apache Shiro:あなたはどのようにユーザーを管理しますか?

  1. 登録されているすべてのメンバーにShiroユーザーを作成するのがよいですか?
  2. Shiroのユーザーを1人作成して、メンバーごとにいくつかのデータベースに保存し、そのShiroユーザーからアクセスしますか?

#1の場合、どのように管理/自動化しますか?私が取り組んだプロジェクトのほとんどは#2を選んだ。

shiro.iniのおかげで

答えて

10
  1. ユーザーの設定は、本番環境のために良いオプションではありません。少数のユーザーアカウントしかなく、実行時にアカウントを作成または変更する必要がない場合にのみ使用できます。これは主にテストに使用されます。
  2. ほとんどすべてのプロジェクトで、すべてのユーザーアカウントを保持するためにストレージを使用する方がよい場合があります。これは、データベースや、ldap、cas、oauthなどの外部認証エンジンにすることができます。
3

ユーザー/グループストアにはStormpathを使用できます。完全管理UIとJava SDKを使用して、Shiro対応アプリケーション用のShiro integrationとブームインスタントユーザー/グループデータストアを削除してください。

「パスワードを忘れた」メールやアカウントのメール確認などの自動化に役立ちます。それは多くの用途でも無料です。例としてShiro sample app using Stormpathが表示されます。

0

Shiroには、複数の方法でユーザーを設定できます。可能なレルムの設定hereを見てください。

あなたのニーズを満たすものがなければ、NoSQLデータベースからユーザー情報を取得したり、SAMLレスポンスから情報を取得したり、OAuth2を使用するなど、アプリケーション用のカスタムレルムを作成することもできます。プロダクションでは、ユーザの詳細をshiro.iniに作成することは絶対にお勧めしません。カスタム領域がどのように表示されるかについては、ここでSAML2ベースのユーザーauthcとauthzを作成した例を示します。shiro-saml2

0

誰でも1人のユーザーしか使用しないでください。このオプションは避けてください。 ユーザーあたり1人のユーザー(アカウント)を使用するほうがはるかに優れています。

shiroでは、ユーザー/アカウント/権限を格納するためにmysqlのような単純なデータベースを使用できるようにするRDMS領域を持つことができます。 :)

このプロジェクトをクローンしてください(それは私のものではありません)、1分で開始できます! :) shiro/mysql GIT example お楽しみください:)

0

あなたの要件に応じて独自の領域を実装することを提供します。

詳細、ログイン、権限、および役割を管理できる単純なレルムを作成します。 jdbc、Hibernateなどの認証方法を使用して管理できます。

このレルムを、自分のプロジェクトに使用しているiniなどの方法で設定します。

これで、Shiroは自動的にレルムクラスのメソッドを呼び出して、資格、権限、ロールを検索します。

私はshiro hibernate realmを持っています。私は、私のデータベース内のユーザーを管理するために休止状態のコードを使用しました。

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

} 
関連する問題