我必须处理由apache shiro保护的应用程序。
我对这个框架很陌生。据我所见,我可以通过subject.isPermitted()
检查单项权利,例如
Subject subject = SecurityUtils.getSubject();
[...]
subject.isPermitted("$RightString");
出于日志记录的目的,我需要完整的用户权限列表作为字符串。而且我不想迭代权限列表并每次检查,subject.isPermitted()
是true
这个问题有什么捷径吗?
修改:
更多信息:
realm在应用程序上下文中定义为bean
<bean id="PRODUCTNAMERealm" class="de.PATHFROMPRODUCT_PRODUCTNAMEJdbcRealm">
<property name="dataSource" ref="dataSource"/>
<property name="schema" value="${PRODUCTNAME.schema}"/>
</bean>
所以如果需要,我可以注射它。
答案 0 :(得分:3)
我相信没有现成的方法可以做到这一点,我们通过在会话上注册用户权限来解决这个问题。我们使用自定义域实现,我们的权限存储在数据库中。
在我们的自定义领域类中:
@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();
答案 1 :(得分:1)
在我看来,Shiro只关注当前用户的安全性,权限等,而不是整个用户群。您可以使用标准SQL查询来检索用户权限。
答案 2 :(得分:0)
您可以在自己的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);