如何在Apache Shiro中从校长那里获得角色?

时间:2017-09-04 07:18:37

标签: authorization shiro

我有点被困在这里。

使用非常简单的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作为角色在代码中进行授权。 在一个场景中,我需要获得角色名称才能继续。

有人可以建议如何从PrincipalSecurityUtils.getSubject().getPrincipal())建议吗?

我想我们需要getRoles()使用SimpleAccount类,但无法将其与Principal连接。

1 个答案:

答案 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")。据我所知,没有办法列出主题目前拥有的所有角色。您只能检查主题是否具有此类或此类角色

如果我误解了你的问题,请随意发表评论