2014-08-29 100 views
2

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

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

为了记录目的,我需要用户权限的完整列表作为字符串。我不想重复权利列表并检查每次,是否subject.isPermitted()true

是否有任何捷径来解决这个问题?

编辑:

更多信息:

  • 应用是在应用程序上下文一个Spring 4应用
  • 境界被定义为豆

    <bean id="PRODUCTNAMERealm" class="de.PATHFROMPRODUCT_PRODUCTNAMEJdbcRealm"> 
        <property name="dataSource" ref="dataSource"/> 
        <property name="schema" value="${PRODUCTNAME.schema}"/> 
    </bean> 
    

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

+1

你的境界是什么? – 2014-08-29 11:14:34

+0

@sallu添加了领域信息。 – 2014-08-29 13:06:42

回答

2

我相信没有开箱即用的方式来做到这一点,我们通过在会话中注册用户权限来解决此问题。我们正在使用自定义域实现,我们的权限存储在数据库中。

在我们的自定义领域类:

@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(); 
+0

如果我正确理解你的话:我必须得到自定义领域类的实现的源代码(在我的例子中是JdbcRealm的扩展),并且我将有两个选项 - 如果你的代码是正确的:a)将权限进入会话,然后从那里检索它,并b)你的代码建议:只需获得AuthorizationInfo。应该有一个getter。不幸的是我必须等到星期一。但我会检查出来并让你知道。 – 2014-08-29 20:41:15

+0

是的。掌握AuthorizationInfo也可以,因为它有一个getStringPermission方法给你一组所有的权限。然而,在我们的项目中,我们并未使用这种方式。我不认为有一个简单的方法来获取它,因为这个对象只用于领域,并且它不会直接暴露。 – Wouter 2014-08-30 06:12:43

+0

我现在看到你正在使用spring,所以你也可以注入jdbc领域,并确实获得AuthorizationInfo对象,为此调整了我的答案。 – Wouter 2014-08-30 06:18:43

1

在我看来,Shiro只与当前用户的安全,权限等有关,而不是整个用户群。您可以使用标准SQL查询来检索用户权限。

+0

我们确实将用户权限存储在数据库中。所以如果我对用户的权利感兴趣,我可以查询数据库。但是我没有提到的是我正在做这件事的背景或目的。目前,我们在Shiro /集群场景中出现问题,看起来Shirosession“忘记”了用户/权利。为了调试这种情况,我想在某些情况下跟踪哪些用户登录,以及Shiro与这个特殊用户关联的权限。某处是我们设置的一个漏洞,目前我不知道在哪里。 – 2014-09-01 14:38:02

相关问题