2017-06-16 15 views
0

Apache Shiro(v1.2.3)を使用していて、ユーザー名とパスワードの認証が正しく設定されていて、動作しています(リモートデータベースにパスワードのハッシュと塩を保存しています)。私は今、役割を使って権限を設定しようとしています。私にはAuthorizingRealmを拡張する単一の領域があります。Apache Shiroの役割と権限が動作しない

public class MyRealm extends AuthorizingRealm { 

    @Override 
    protected AuthenticationInfo doGetAuthenticationInfo(
      AuthenticationToken token) throws AuthenticationException { 
     // no problems here... 
    } 

    @Override 
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principles) { 
     Set<String> roles = // get the roles for this user from the DB 
     LOG.info("Found roles => " + roles.toString()); 
     return new SimpleAuthorizationInfo(roles); 
    } 

} 

shiro.iniは、次のようになります。

[メイン]
MYREALM = ie.enki.closing.users.MyRealm

credentialsMatcher = org.apache.shiro.authc。 credential.Sha256CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = false
credentialsMatcher.hashIterations = 1024

myRealm.credentialsMatcher = $ credentialsMatcher

のCacheManager = org.ehcache.integrations.shiro.EhcacheShiroManager
securityManager.cacheManager = $のCacheManager = *
スタッフ

[役割]
管理者= resource_1:action_1

ehcacheがbeinであることを関連する起動ログに記録します。それがない前にグラムの設定が正しくけど、それはまた、この言及:

[メイン] INFO org.apache.shiro.realm.text.IniRealm - IniRealm定義され、 が、定義された[ユーザー]セクションがありません。この領域にはどのユーザーも入力されず、 が入力され、プログラムによって入力されます。このRealmインスタンスが になるようにユーザを定義する必要があります。
[main] INFO org.apache.shiro.realm.AuthorizingRealm - キャッシュなし またはcacheManagerプロパティが設定されています。認証キャッシュは を取得できません。
は...
一部にehcacheセットアップログ...私のテストで

、私のログは私がadmin役割を持っていることを述べているにもかかわらずcurrentUser.isPermitted("resource_1:action_1")戻りfalseは(私もstaff役割でそれを試してみました)。

ドキュメントは次のようにユーザにロールをshiro.iniの[ユーザー]セクションを設定し、割り当ての話四郎:

[ユーザー]
some_user =パスワード、ROLE1、ROLE2

...しかし、私はユーザーとそのパスワードをiniファイルに定義したくありません。それが私のデータベースです。私は設定で何かを誤解しましたか?

ドキュメントをもう一度読み終えたら、[users]セクションを使用して少数の静的ユーザーを定義している場合にのみ、[roles]セクションが適用されるようです。そうであれば、データベースに定義されているユーザーの権限にロールをどのように関連付けるのですか。 docs that might reveal this infoは不完全です。

答えて

1

IniRealmを使用していない場合は、ロール - >権限を直接マップしないでください。あなたはShiroにユーザが持っているパーミッションをSimpleAuthorizationInfoaddStringPermissionsまたはaddObjectPermissionsとする必要があります。また、ロールを使用してアクセス権のグループを手動で取得する場合は、Shiroに伝えなければなりません。

アプリに応じてこれを行う方法は複数あります。アプリケーションの複雑さを知らなければ、アプローチを推奨することは難しいです。柔軟性を最大限に高めるには、USER_PERMISSIONSROLE_PERMISSIONS、およびUSER_ROLESの3つのデータベーステーブルを作成できます。

許可チェックのみを行っている場合は、doGetAuthorizationInfoは、ユーザーに割り当てられているアクセス許可を取得することをお勧めします。ロールはフロントエンドでのみ使用され、特定のユーザーに権限のグループを割り当てる際に役立ちます。これは、Shiroが推薦するExplicit Role(Roles)です。

@Override 
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principles) { 
    Set<String> permissions = // get the permissions for this user from the DB 
    SimpleAuthorizationInfo simpleAuth = new SimpleAuthorizationInfo(); 
    simpleAuth.addStringPermissions(permissions); 
    return simpleAuth; 
} 

P. [roles]セクションを削除して、あなたのレルムをShiroに明示的に定義します。 Implicit Assignmentはお勧めしません。これを行うには、[roles]を削除した後で、設定に次の行を追加します。

securityManager.realms = $myRealm 
関連する問題