如何从Apache Shiro的主体中获取角色?

3

我有一些困惑。

使用一个非常简单的 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())中获取吗?
我猜我们需要在SimpleAccount类中使用getRoles(),但无法将其与Principal连接起来。
1个回答

4

首先,关于你的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")。据我所知,没有办法列出主体当前拥有的所有角色。您只能检查主体是否具有某个角色。

如果我误解了您的问题,请随时评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接