Apache Shiro,isPermitted() 不工作

Posted

技术标签:

【中文标题】Apache Shiro,isPermitted() 不工作【英文标题】:Apache Shiro, isPermitted() isn´t working 【发布时间】:2012-09-18 02:28:06 【问题描述】:

我正在使用 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

我现在不明白为什么只是权限没有被数据库捕获。

【问题讨论】:

【参考方案1】:

检查您的财产:

select permissoes from VUsuarioPerfil

您需要更正权限

【讨论】:

好的,没关系,您可以在表格中保留您喜欢的任何字段名称【参考方案2】:

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

所以本质上,被调用的查询是:

select permissoes from VUsuarioPerfil where usuario = usuario

而且,正如您所料,它什么也不返回。所以角色没有权限,用户也没有权限。

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

select permission from roles_permissions where role_name = ?

【讨论】:

以上是关于Apache Shiro,isPermitted() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Spring 忽略了 Apache Shiro Realm 类中的 @Transactional 注释

(转)shiro权限框架详解05-shiro授权

shiro之授权授权流程

shiro

带你揭秘Shiro

基于shiro授权过程