【发布时间】: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