2

学習のためだけに Apache Shiro でテストを行っていますが、アクセス許可に問題があります。メソッド isPermitted() は機能しません。つまり、常に false を返します。

shiro.ini

[main]

sha256Matcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
sha256Matcher.hashAlgorithmName=SHA-256


authc.loginUrl = /faces/views/login.xhtml
authc.successUrl = /faces/views/index.xhtml

builtInCacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $builtInCacheManager

jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true 
jdbcRealm.authenticationQuery = select senha from VUsuarioPerfil where usuario = ?
jdbcRealm.userRolesQuery = select perfil from VUsuarioPerfil where usuario = ?
jdbcRealm.permissionsQuery = select permissoes from VUsuarioPerfil where usuario = ?

jdbcRealm.credentialsMatcher = $sha256Matcher

ds = com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
ds.serverName = 192.168.50.254
ds.user = xx
ds.password = xxx
ds.databaseName = shiro
jdbcRealm.dataSource = $ds

各ユーザーは独自の権限を持つ必要があるため、ビュー (VUsuarioPerfil) には、"clientes:visualizar" のような文字列を配置した permissoes という列があります。コードでは、この方法でテストします

public void test() {
    System.out.println(SecurityUtils.getSubject().hasRole("usuario"));
    System.out.println(SecurityUtils.getSubject().isPermitted("clientes:visualizar"));
}

結果が出力されます:

true
false

データベースでパーミッションだけがキャッチされない理由はわかりません。

4

2 に答える 2

4

JDBC レルムでは、パーミッション クエリはユーザー -> ロールをマップすることは想定されておらず、ロール -> パーミッションをマップすることが想定されています。

基本的に、呼び出されるクエリは次のとおりです。

select permissoes from VUsuarioPerfil where usuario = usuario

そして、ご想像のとおり、何も返しません。したがって、ロールには権限がなく、ユーザーには権限がありません。

おそらく、既定のアクセス許可クエリを考慮すると、クエリをデータ構造にマップする方法を考えるのに役立つでしょうか?

select permission from roles_permissions where role_name = ?
于 2012-09-26T16:58:48.843 に答える
0

あなたの財産をチェックしてください:

select permissoes from VUsuarioPerfil

権限を修正する必要があります

于 2012-09-26T12:53:57.197 に答える