【问题标题】:How to determine which permissions a shiro user has如何判断一个shiro用户有哪些权限
【发布时间】:2014-10-23 09:10:14
【问题描述】:

我必须处理一个由 apache shiro 保护的应用程序。 我对这个框架很陌生。据我所知,我可以通过subject.isPermitted()查看单一权限,例如

Subject subject = SecurityUtils.getSubject();
[...]
subject.isPermitted("$RightString");

出于记录目的,我需要完整的用户权限列表作为字符串。而且我不想遍历权限列表并每次检查subject.isPermitted()是否为true

这个问题有什么捷径吗?

编辑:

更多信息:

  • 应用程序是 Spring 4 应用程序
  • realm 在应用程序上下文中被定义为一个 bean

     <bean id="PRODUCTNAMERealm" class="de.PATHFROMPRODUCT_PRODUCTNAMEJdbcRealm">
         <property name="dataSource" ref="dataSource"/>
         <property name="schema" value="${PRODUCTNAME.schema}"/>
     </bean>
    

    所以如果需要我可以注入它。

【问题讨论】:

  • @sallu 领域信息已添加。

标签: java shiro


【解决方案1】:

我相信没有现成的方法可以做到这一点,我们通过注册会话的用户权限来解决这个问题。我们正在使用自定义领域实现,我们的权限存储在数据库中。

在我们的自定义领域类中:

@Override
public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    Set<String> permissionsSet = //logic to get the permissions here

    info.addStringPermissions(permissionsSet);

    SecurityUtils.getSubject().getSession().setAttribute("permissions", permissionsSet);
    return info;
}

现在检索权限只需调用:

SecurityUtils.getSubject().getSession().getAttribute("permissions");

另一种方法是在您需要信息的地方注入您的自定义领域,并让 bean 公开 getAuthorizationInfo。

@Override
public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
    return super.getAuthorizationInfo(principals);
}

....

yourRealm.getAuthorizationInfo(SecurityUtils.getSubject().getPrincipals()).getStringPermissions();

【讨论】:

  • 如果我的理解正确:我必须获取自定义领域类的实现源(在我的情况下是 JdbcRealm 的扩展),我将有两个选择 - 如果您的代码是正确:a)将权限放入会话中,然后从那里检索它,b)您的代码建议:只需获取 AuthorizationInfo。应该有一个吸气剂。不幸的是,我必须等到星期一。但我会检查一下并告诉你。
  • 是的。获取 AuthorizationInfo 也可以,因为它有一个 getStringPermission 方法,可以为您提供一组所有权限。但是在我们的项目中我们不使用这种方式。我不认为有一个简单的方法可以得到它,因为这个对象只在领域中使用并且它从不直接暴露。
  • 我现在看到您正在使用 spring,因此您也可以注入 jdbc 领域并确实获得 AuthorizationInfo 对象,为此调整了我的答案。
  • 我接受你的回答,因为它应该可以工作。但正如我意识到的那样,我的根本问题已经转向了一个意想不到的方向,所以我不需要解决用户权限。非常感谢你!
【解决方案2】:

在我看来,Shiro 仅与当前用户的安全性、权限等有关,与整个用户群无关。您可以使用标准 SQL 查询来检索用户权限。

【讨论】:

  • 我们确实将用户权限存储在数据库中。所以如果我对用户的权利感兴趣,我可以查询数据库。但我没有提到的是我这样做的背景或目的。目前我们在 Shiro/Cluster-scenario 中遇到问题,Shirosession 似乎“忘记”了用户/权限。为了调试这种情况,我想在某些情况下跟踪哪些用户登录,以及 Shiro 与这个特殊用户关联的权限。我们的设置中有一个漏洞,目前我不知道在哪里。
【解决方案3】:

您可以在自己的 AuthorizingRealm 实现中覆盖函数 getAuthorizationInfo

public class LoginPasswordRealm extends AuthorizingRealm {
    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals){
        return super.getAuthorizationInfo(principals);
    }
}

然后使用它:

Subject currentUser = SecurityUtils.getSubject();
LoginPasswordRealm realm = (LoginPasswordRealm)securityManager.getRealms().iterator().next();
AuthorizationInfo authorizationInfo = realm.getAuthorizationInfo(currentUser.getPrincipals());
authorizationInfo.getStringPermissions().forEach(System.out::println);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 2011-05-03
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多