如何确定shiro用户拥有的权限

时间:2014-08-29 10:54:26

标签: java shiro

我必须处理由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>
    

    所以如果需要,我可以注射它。

3 个答案:

答案 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);