Java 如何确定shiro用户拥有哪些权限

Java 如何确定shiro用户拥有哪些权限,java,shiro,Java,Shiro,我必须处理一个由ApacheShiro保护的应用程序。 我对这个框架很陌生。据我所知,我可以通过subject.isPermitted(),例如 Subject subject = SecurityUtils.getSubject(); [...] subject.isPermitted("$RightString"); 出于日志记录的目的,我需要完整的用户权限列表作为字符串。我不想每次都重复访问权限列表并检查subject.ispermited()是否为true 这个问题有捷径吗 编辑: 进

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

Subject subject = SecurityUtils.getSubject();
[...]
subject.isPermitted("$RightString");
出于日志记录的目的,我需要完整的用户权限列表作为字符串。我不想每次都重复访问权限列表并检查
subject.ispermited()
是否为
true

这个问题有捷径吗

编辑:

进一步资料:

  • 应用程序是Spring4应用程序
  • 领域在应用程序上下文中定义为bean

     <bean id="PRODUCTNAMERealm" class="de.PATHFROMPRODUCT_PRODUCTNAMEJdbcRealm">
         <property name="dataSource" ref="dataSource"/>
         <property name="schema" value="${PRODUCTNAME.schema}"/>
     </bean>
    
    
    
    如果需要的话我可以注射


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

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

@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;
}
另一种方法是在需要信息的地方注入自定义域,并让bean将getAuthorizationInfo公开

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

....

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

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

您可以在自己的AuthorizationRealm实现中重写函数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);

@添加了sallu领域信息。如果我理解正确:我必须获得自定义领域类(在我的例子中是JdbcRealm的扩展)实现的源代码如果你的代码是正确的,我将有两个chioce:a)将权限放入会话中,然后从会话中检索权限;b)你的代码建议:只需获取授权信息。应该有一个getter。不幸的是,我不得不等到星期一。但我会查一查,然后告诉你。获取AuthorizationInfo也可以,因为它有一个getStringPermission方法,为您提供一组所有perm。然而,在我们的项目中,我们不使用这种方式。我不认为有一个简单的方法可以得到它,因为这个对象只在领域中使用,而且从来没有直接公开过。我现在看到你在使用spring,所以你也可以注入jdbc领域,并确实获得AuthorizationInfo对象,为此调整了我的答案。我接受你的答案,因为它应该可以工作。但正如我意识到的,我的根本问题已经转移到了一个意想不到的方向,所以我不需要解决用户的问题。非常感谢!我们实际上是在数据库中存储用户权限。因此,如果我对用户权限感兴趣,我可以查询数据库。但我没有提到我做这件事的背景或目的。目前,我们在Shiro/集群场景中遇到了问题,Shirosession似乎“忘记”了用户/权限。为了调试这种情况,我想在某些情况下跟踪,什么用户登录,Shiro与这个特殊用户关联什么权限。我们的设置中有一个漏洞,目前我不知道在哪里。
Subject currentUser = SecurityUtils.getSubject();
LoginPasswordRealm realm = (LoginPasswordRealm)securityManager.getRealms().iterator().next();
AuthorizationInfo authorizationInfo = realm.getAuthorizationInfo(currentUser.getPrincipals());
authorizationInfo.getStringPermissions().forEach(System.out::println);