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