繁体   English   中英

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

[英]How to determine which permissions a shiro user has

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

Subject subject = SecurityUtils.getSubject();
[...]
subject.isPermitted("$RightString");

出于记录目的,我需要用户权限的完整列表作为字符串。 而且我不想遍历权限列表并每次都检查, subject.isPermitted()是否为true

这个问题有什么捷径可走吗?

编辑:

更多信息:

  • 应用程序是 Spring 4 应用程序
  • 领域在应用程序上下文中定义为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM