我可以将Apache Shiro用于分层用户模型吗?

时间:2014-11-13 08:49:20

标签: java apache java-ee permissions shiro

我正在设计一个应用程序,用户在多个级别的层次结构中进行组织。可以使用角色将用户分配到此层次结构的任何级别。

organization hierarchy example http://i59.tinypic.com/14ya3vd.png

所以,我想知道是否有办法让Apache Shiro适应这种层次结构,我可以在其中为角色IN组织定义权限,这意味着,不仅仅有一个" admin"可以对任何用户执行任何操作的角色,但是" admin" "组织A"可以对属于"组织A"的任何用户执行任何操作。或其任何子组织。

我认为我正在寻找的是一种路径机制,类似于Apache Shiro通配符系统,但具有组织路径,例如:

users:*:organizationA/*

这意味着对用户对组织A及其所有子组织内所有用户的任何操作的许可。

最后,我需要的是对分层用户模型中的资源的权限系统。有没有办法用Apache Shiro模拟这样的东西?我应该使用任何其他框架,还是需要添加一些代码来实现这一目标?

2 个答案:

答案 0 :(得分:2)

好吧,我最后重新发明了轮子。我放弃了Apache Shiro,因为如果我必须实现自己的权限解析器,我无法找到它的用处,所以我自己创建了一个。在我的权限系统中,我使用组织层次结构,顺便说一下,它最终成为一个图形。因此,我的权限在其定义中需要有点复杂。这就是我编写它们的方式:

Role:ResourceType:Action:Scope

因此权限定义为:"通过此类资源,此角色可以执行此操作"。并且要将该定义与层次结构相关联,因此,要知道如何使用该角色来解决该问题,我就有了范围。范围告诉我们何时应用权限,并且它与层次结构直接相关。

我假设我可以使用定位器在层次结构中放置任何资源。在我的例子中,定位器是用户或组织。我知道这很复杂(或许它不是,我只是解释得很差),所以让我们跳到一个例子。

我有这个层次结构:

  • 组织:Camelot
    • :arthur
    • 骑士:galahad
    • 组织:圆桌会议
      • 国王:galahad
      • 骑士:lamorak

现在让我们假设我们有一个资源 Excalibur ,类型为 mightyWeapon ,还有一个动作进行。现在,我们想要讲述强大的武器:如果他们属于同一个组织或任何其他子组织,他们可以由国王携带。所以我们允许这样说,就是这样:

king:mightyWeapon:carry:sameBelow

本案例中的范围是 sameBelow ,它告诉我们这适用于国王所属的同一组织或该组织的任何子组织。

现在,要检查一下,我必须告诉资源在层次结构中的位置。在这种情况下,我们假设Excalibur属于Camelot。

现在让我们检查用户 arthur 是否可以携带 Excalibur 。因此,解决许可所涉及的变量将是:

  • 用户:arthur
  • 资源类型:mightyWeapon
  • 行动:携带
  • 资源的定位器:Camelot

现在,要解决此权限检查,我们会获得 arthur 的所有会员记录。也就是说,他所属的每个组织和所应用的角色。我们有两个:

  1. 卡米洛特之王
  2. RoundTable的骑士
  3. 对于每一个,我们尝试解析权限。对于第一个,我们知道国王可以携带属于同一组织或其下任何其他组织的强大武器。 Excalibur 属于 Camelot arthur 也属于 King ,所以他可以携带它们。我们将在这里停止检查,并且许可的解决方案将是可能的。

    现在,让我们检查 galahad 是否可以携带Excalibur。他有这些会员资格:

    1. Camleot骑士
    2. RoundTable之王
    3. 对于第一个,我们没有任何许可告诉我们骑士可以携带强大的武器,所以我们会继续解决。

      对于第二个,我们知道国王可以携带强大的武器,但是神剑并不像加拉哈德作为国王那样处于同一水平,或者与任何子组织处于同一水平,因为RoundTable本身就是卡米洛特的一个子组织。因此,此权限检查会解决为否定。

      就是这样。我希望这个例子能够澄清一下。当然,我有一堆范围可以使其更加完整,但这是我提出的最佳解决方案。欢迎提出任何改进建议。

答案 1 :(得分:1)

您可以创建 WildcardPermission 类的子类,并实现自己的隐含方法来编写自己的权限字符串实现。

然后覆盖 WildcardPermissionResolver 以返回您的权限实现,而不是标准权限。

然后您可以将其配置为在shiro.ini中全局使用:

globalPermissionResolver = com.foo.bar.MyPermissionResolver

请参阅此处的文档:https://shiro.apache.org/authorization.html#Authorization-Configuringaglobal%7B%7BPermissionResolver%7D%7D