我有点被困在这里。
使用非常简单的Shiro配置和jdbcRealm:
[main]
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager
# Create JDBC realm.
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
# Configure JDBC realm datasource.
ds = org.postgresql.ds.PGSimpleDataSource
ds.databaseName = pg_sensor
***
jdbcRealm.dataSource = $ds
# Configure JDBC realm SQL queries.
jdbcRealm.authenticationQuery = SELECT pass FROM users WHERE name = ?
# user id is a user Role )
jdbcRealm.userRolesQuery = SELECT id FROM users WHERE name = ?
因此,我使用userid
作为角色在代码中进行授权。
在一个场景中,我需要获得角色名称才能继续。
有人可以建议如何从Principal
(SecurityUtils.getSubject().getPrincipal()
)建议吗?
我想我们需要getRoles()
使用SimpleAccount
类,但无法将其与Principal
连接。
答案 0 :(得分:0)
在此之前,有关你的shiro.ini的一些评论:
首先,你的jdbcRealm.userRolesQuery
没有意义:你应该为这个查询获取角色而不是用户。
假设你有桌子
CREATE TABLE user{
id INTEGER,
username VARCHAR,
password VARCHAR
}
CREATE TABLE user_role{
id INTEGER,
role_name VARCHAR,
username VARCHAR
}
您的查询需要:
# Configure JDBC realm SQL queries.
jdbcRealm.authenticationQuery = SELECT password FROM user WHERE username = ?
# user id is a user Role )
jdbcRealm.userRolesQuery = SELECT role_name FROM user_role WHERE username = ?
我假设您的主题已经成功通过身份验证。到目前为止,SecurityUtils.getSubject().getPrincipal()
只会返回登录或用户名,这些内容可识别您的用户,但仅此而已。在上面的示例中,它将返回存储在username
列中的值。
我认为,您正在寻找此经过身份验证的用户是否具有角色" MyRole"?。在这种情况下,您可以浏览SecurityUtils.getSubject().hasRole("MyRole")
。据我所知,没有办法列出主题目前拥有的所有角色。您只能检查主题是否具有此类或此类角色
如果我误解了你的问题,请随意发表评论