![](/img/trans.png)
[英]which is better assign multiple permissions or multiple roles to user in shiro?
[英]How to determine which permissions a shiro user has
我必须处理由 apache shiro 保护的应用程序。 我对这个框架很陌生。 据我所知,我可以通过subject.isPermitted()
检查单个权限,例如
Subject subject = SecurityUtils.getSubject();
[...]
subject.isPermitted("$RightString");
出于记录目的,我需要用户权限的完整列表作为字符串。 而且我不想遍历权限列表并每次都检查, subject.isPermitted()
是否为true
这个问题有什么捷径可走吗?
编辑:
更多信息:
领域在应用程序上下文中定义为 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;
}
现在检索权限只是调用的问题:
SecurityUtils.getSubject().getSession().getAttribute("permissions");
另一种方法是在需要信息的地方注入自定义领域,并使 bean 公开 getAuthorizationInfo。
@Override
public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
return super.getAuthorizationInfo(principals);
}
....
yourRealm.getAuthorizationInfo(SecurityUtils.getSubject().getPrincipals()).getStringPermissions();
在我看来,Shiro 只与当前用户的安全、权限等有关,与整个用户群无关。 您可以使用标准 SQL 查询来检索用户权限。
您可以在自己的 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.