当前位置: 首页 > 知识库问答 >
问题:

Apache Shiro角色和权限不工作

孙星鹏
2023-03-14

我正在使用Apache Shiro(v1.2.3),我正确地设置了用户名/密码身份验证,并且它正在工作(我将密码散列和salt存储在远程数据库中)。我现在正在尝试使用角色设置权限。我有一个扩展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如下所示:

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

[角色]
管理员=*
staff=资源_1:Action_1

相关的启动日志记录报告ehcache已正确设置,但在正确设置之前,它还会提到以下内容:

[main]INFO org.apache.shiro.realm.text.IniRealm-已定义了IniRealm,但没有定义[users]节。此领域将不填充任何用户,并且假定将以编程方式填充这些用户。必须定义用户才能使此领域实例有用。
[main]INFO org.apache.shiro.Realm.authorizingRealm-未设置缓存或cacheManager属性。无法获取授权缓存。
...
某些ehcache安装日志记录...

在我的测试中,currentuser.ispermitted(“resource_1:action_1”)返回false,尽管我的日志记录显示我有admin角色(我也尝试过使用staff角色)。

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

[users]
some_user=密码,role1,role2

...但我不想在ini文件中定义用户及其密码。这就是我数据库的用途。我是不是误解了配置中的什么东西?

再次查看文档后,似乎只有在使用[users]部分定义少量静态用户时,[roles]部分才适用。如果是这样,那么如何将角色与数据库中定义的用户的权限相关联。可能透露此信息的文档是不完整的。

共有1个答案

贺皓
2023-03-14

当您不使用inirealm时,您不会直接映射角色->权限。您必须通过SimpleAuthorizationInfo的addStringPermissions或addObjectPermissions告诉Shiro用户具有哪些权限,如果您使用角色分配权限组,则手动检索这些权限。

根据应用程序的不同,有多种方法可以做到这一点。如果不知道应用程序有多复杂,就很难推荐一种方法。为了获得最大的灵活性,可以创建3个数据库表:user_permissionsrole_permissionsuser_roles

如果您只进行权限检查,我建议dogetauthorizationinfo只检索分配给用户的权限。角色只能在前端上用于帮助将权限组分配给某些用户。这是四郎在《角色》中推荐的明确角色。

@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。不建议使用隐式赋值。为此,请在删除[roles]后向配置添加以下行。

securityManager.realms = $myRealm
 类似资料:
  • 我正在尝试让Spring Security角色与websphere自由一起工作。我知道我的自由设置是正确的,因为我编写了一个非常简单的servlet 3应用程序,它具有基于角色的限制,并且在同一台服务器上使用相同的角色限制。 以下是我的安全配置的相关部分: 上面是在服务器日志中打印出“使用容器管理”,所以我知道这:) 在我的控制器中,我传入了主体: 但是当我打电话的时候: 我什么也没得到。 以下是

  • 我有一个springmvc和springsecurity项目。 角色: 权限: 以及在角色和权限之间: 接下来的情况是: 我有一个控制器,我想用注释保护操作 大概是这样的: 但是注释不起作用,但是如果我把代码改成这样就可以了: 有人能给我一个提示吗?我不想用权限限制操作,我更喜欢角色限制。 提前谢谢。

  • 角色是分配给用户的权限集合。默认情况下,Navicat Monitor 包含三个预定义的角色供你分配给不同用户以限制其访问权限。它还允许你创建具自定义权限设置的新角色。苃要配置角色及其权限,请前往“配置”->“角色和权限”。 每个预定义的角色都有不同的权限: 角色 权限 管理员 可以完全控制访问所有页面。此角色的权限是不可编辑的。 DBA 可以访问所有页面,但以下功能“除外”: - 激活令牌密钥,

  • 下午好.如何在不使用不同的OAUTH2服务的情况下,为一个应用程序中的特定实体(类似于RBAC/ABAC)的特定控制器配置用户的权限和角色? 还有一个名为Project的实体。用户可能是许多项目的成员。有一些项目用户角色:PROJECT_ADMIN、PROJECT_EDITO、PROJECT_USER。每个项目角色都可以拥有自己的权限(权限),如向项目添加用户、编辑项目等。所有角色配置都存储在'P

  • 所以,请提前指导我如何在spring mvc中实现这个任务谢谢。

  • 诸葛io提供了权限管理的功能,共分为超级管理员、管理员、开发者、普通成员、普通成员(仅看板)五种。 接下来分别从公司层面和应用层面区分这些成员的使用权限。 一、成员角色权限表·公司层面 超级管理员 其他成员 公司信息 查看公司基本信息 √ 修改公司名称 √ 查看套餐信息 √ 成员管理 查看公司成员 √ 邀请公司成员 √ 移除公司成员 √ 小组管理 查看小组 √ 新建编辑删除小组 √ 权限管理 移交