gpt4 book ai didi

java - Apache Shiro 角色和权限不起作用

转载 作者:行者123 更新时间:2023-12-02 02:45:50 27 4
gpt4 key购买 nike

我正在使用 Apache Shiro (v1.2.3),并且我的用户名/密码身份验证设置正确并且它正在工作(我将密码哈希值和盐存储在远程数据库中)。我现在尝试使用角色设置权限。我有一个扩展 AuthorizingRealm 的领域,例如

public class MyRealm extends AuthorizingRealm {

@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
// no problems here...
}

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principles) {
Set<String> roles = // get the roles for this user from the DB
LOG.info("Found roles => " + roles.toString());
return new SimpleAuthorizationInfo(roles);
}

}

我的shiro.ini看起来像这样:

[main]
myRealm = ie.enki.closing.users.MyRealm

credentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = false
credentialsMatcher.hashIterations = 1024

myRealm.credentialsMatcher = $credentialsMatcher

cacheManager = org.ehcache.integrations.shiro.EhcacheShiroManager
securityManager.cacheManager = $cacheManager

[roles]
admin = *
staff = resource_1:action_1

相关的启动日志记录报告 ehcache 正在正确设置,但在此之前,它还提到了这一点:

[main] INFO org.apache.shiro.realm.text.IniRealm - IniRealm defined, but there is no [users] section defined. This realm will not be populated with any users and it is assumed that they will be populated programatically. Users must be defined for this Realm instance to be useful.
[main] INFO org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set. Authorization cache cannot be obtained.
...
some ehcache setup logging...

在我的测试中,currentUser.isPermission("resource_1:action_1") 返回 false,即使我的日志显示我确实拥有admin 角色(我也尝试过使用 staff 角色)。

shiro 文档讨论了在 shiro.ini 中设置 [users] 部分并向用户分配角色,例如:

[users]
some_user = password, role1, role2

...但我不想在 ini 文件中定义用户及其密码。这就是我的数据库的用途。我是否误解了配置中的某些内容?

再次查看文档后,似乎 [roles] 部分仅适用于您使用 [users] 部分定义少量静态用户的情况。如果这是真的,那么如何将角色与数据库中定义的用户的权限关联起来。 docs that might reveal this info不完整。

最佳答案

当您不使用IniRealm时,您不会直接映射角色 -> 权限。您必须通过 SimpleAuthorizationInfoaddStringPermissions 告诉 Shiro 用户拥有哪些权限或addObjectPermissions如果您使用角色来分配权限组,请手动检索这些权限。

根据您的应用程序,有多种方法可以执行此操作。如果不知道您的应用程序有多复杂,就很难推荐一种方法。为了获得最大的灵 active ,您可以创建 3 个数据库表:USER_PERMISSIONSROLE_PERMISSIONSUSER_ROLES

如果您只进行权限检查,我建议 doGetAuthorizationInfo 仅检索分配给用户的权限。角色仅在前端使用,以协助将权限组分配给某些用户。这是Shiro在Roles中推荐的Explicit Role .

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principles) {
Set<String> permissions = // get the permissions for this user from the DB
SimpleAuthorizationInfo simpleAuth = new SimpleAuthorizationInfo();
simpleAuth.addStringPermissions(permissions);
return simpleAuth;
}

附注我将删除 [roles] 部分并明确将您的领域定义为 Shiro。 Implicit Assignment不推荐。为此,请在删除 [roles] 后将以下行添加到您的配置中。

securityManager.realms = $myRealm

关于java - Apache Shiro 角色和权限不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44592526/

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