Apache Shiro,isPermitted()不起作用

时间:2012-09-26 12:50:37

标签: permissions shiro

我正在使用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)上有一个名为permissoes的列,我在其中放置了一个字符串,如“clientes:visualizar”。 在代码我测试这种方式

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

输出结果:

true
false

我现在不知道为什么只有权限才会被数据库捕获。

2 个答案:

答案 0 :(得分:4)

在JDBC领域,权限查询不应映射用户 - >角色,它应映射角色 - >权限。

基本上,被调用的查询是:

select permissoes from VUsuarioPerfil where usuario = usuario

并且,正如您所期望的那样,它什么都不返回。因此,该角色没有权限,用户没有权限。

也许考虑默认权限查询可以帮助您考虑如何将查询映射到数据结构?

select permission from roles_permissions where role_name = ?

答案 1 :(得分:0)

查看您的财产:

select permissoes from VUsuarioPerfil

您需要更正权限