gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:08:05 25 4
gpt4 key购买 nike

我有点卡在这里。

使用带有 jdbcRealm 的非常简单的 Shiro 配置:

[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 连接。

最佳答案

在任何事情之前,对你的 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")。据我所知,没有办法列出一个主题当前拥有的所有角色。你只能检查主题是否有这样或那样的角色

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

关于authorization - 如何从 Apache Shiro 中的主体获取角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com