【问题标题】:Apache Shiro userRolesQuery only looking for an intApache Shiro userRolesQuery 只寻找一个 int
【发布时间】:2017-04-24 07:27:17
【问题描述】:

我能够使用 Apache Shiro 进行身份验证,但现在我需要授权,这意味着从数据库中获取角色。查询有效,但前提是我使用整数角色。出于某种原因,它正在寻找整数的角色。如果我必须寻找数字作为角色,这似乎没有帮助,我是否错过了一些告诉 Shiro 寻找字符串或 varchar 的设置?

这是我的 Shiro.ini 文件:

[main]
ds = org.apache.shiro.jndi.JndiObjectFactory 
ds.requiredType = javax.sql.DataSource
ds.resourceName = jdbc/SQL05

jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $ds
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = SELECT company_password FROM CompanyUser where company_username = ?
jdbcRealm.userRolesQuery = SELECT role FROM CompanyUser where company_username = ?

身份验证.java

        System.setProperty("log4j.category.org.apache.shiro", "DEBUG");          
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        Subject currentUser = SecurityUtils.getSubject();
        String  b = "false";
        log.info("WTF");
        try{
            if (!currentUser.isAuthenticated()) {

                UsernamePasswordToken token = new UsernamePasswordToken("user1", "test")   ;
                token.setRememberMe(true);
                try {                        
                    currentUser.login(token); 
                    b = "You have successfully logged in user: " + token.getPrincipal().toString();
                    if (currentUser.hasRole("1")) {
                        b += " and they have the role of being awesome";
                    } else {
                       b += " and we can't find the role yet.";
                    }
                    
                }catch (UnknownAccountException uae) {
                    b =  token.getPrincipal().toString();
                    log.info("There is no user with username of " + token.getPrincipal().toString());
                } 
            }
        }catch (AuthenticationException ae) {
            b = ae.toString();
            log.info(b);
        }catch(Exception e){
            b = e.toString();
            log.info(b);
        }

所以要清楚,这目前有效,因为我有:

 currentUser.hasRole("1")

在那里,角色字段中包含该用户名的 1。如果我在两个地方都将 1 更改为“真棒”(不带引号),我会收到以下错误:

严重:com.microsoft.sqlserver.jdbc.SQLServerException:将 nvarchar 值“Awesome”转换为数据类型 int 时转换失败。

那么如何让它接受字符串呢?

我的表公司用户:

userid int not null 自动递增

personid int 不为空

company_username varchar(15) 不为空

company_password varchar(15) 不是

null 角色 varchar(20) not null

由于某种原因,它试图将“角色”列转换为 int。

【问题讨论】:

  • 您确定您的角色字段的数据库列具有正确的数据类型吗?也许它被声明为 int 所以它试图将任何输入解释为整数
  • 对我来说,字符串工作的角色。请发布您的表结构。
  • 已更新问题并提供所需信息。
  • @dev 现在我正在让它与数字一起工作,但这仅适用于概念证明。

标签: java security authorization shiro


【解决方案1】:

你应该使用currentUser.hasRole("awesome") 而不是currentUser.hasRole(awesome)

awesomea 是一个变量吗?如果是这样,请举一个很棒的例子。

【讨论】:

  • 我上面给出的示例是工作示例,其中数据库有一个 1 变量(数据库列是否为 varchar 的 int 似乎无关紧要。如果是字符串,它将起作用如果字符串只是数字),java也是如此:if(currentUser.hasRole(“1”)。将角色作为字符串是给我这个错误的原因,它出于某种奇怪的原因正在寻找一个数字。
  • 对我来说它也适用于字符串。我有一个角色“GOD”,它映射到权限“*”,它可以工作
  • 您可以尝试将 rolequery 作为 SELECT CAST(role AS NVARCHAR(50)) FROM CompanyUser where company_username = 吗?您是否也在使用权限,因为我看到 jdbcRealm.permissionsLookupEnabled = true 没有任何权限查询。如果您不使用,请将其设为假。似乎是通过驱动程序的 cponversion 的 SQL Server 问题它适用于我的 oracle。
  • 我已经尝试过 CAST(R.role as varchar)。它有效,但同样只适用于可以转换为整数的字符串。我确实将 permissionsLookupEnabled 设置为 true。
猜你喜欢
  • 2011-02-19
  • 2018-09-03
  • 2017-09-20
  • 2016-05-07
  • 2017-01-04
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多