好吧,我最终重新发明了轮子。我放弃了 Apache Shiro,因为如果我必须实现自己的权限解析器,我找不到它的用处,所以我自己创建了一个。在我的权限系统中,我使用组织层次结构,顺便说一下,最终形成了一个图表。因此,我的权限在其定义中需要有点复杂。我是这样组成它们的:
Role:ResourceType:Action:Scope
所以权限被定义为:“这个角色,在这种类型的资源上,可以执行这个动作”。并将该定义与层次结构相关联,因此,要知道如何使用角色来解决这个问题,我有范围。范围告诉我们权限何时适用,它与层次结构直接相关。
我假设我可以使用定位器将任何资源放置在层次结构中。就我而言,定位器是用户或组织。我知道这很复杂(或者可能不是,我只是解释得很糟糕),所以让我们来看一个例子。
我有这个层次结构:
现在假设我们有一个资源 Excalibur,类型为 mightyWeapon,还有一个动作 carry。现在,我们想讲一下强大的武器:如果它们属于同一组织或任何其他子组织,它们可以由国王携带。所以我们允许这样说,是这样的:
king:mightyWeapon:carry:sameBelow
这种情况下的范围是 sameBelow,它告诉我们这适用于国王所属的同一组织或该组织的任何子组织。
现在,要检查这一点,我必须知道资源在层次结构中的位置。在这种情况下,我们假设 Excalibur 属于 Camelot。
现在让我们检查一下用户 arthur 是否可以携带 Excalibur。因此,权限解析中涉及的变量将是这些:
-
用户:亚瑟
-
资源类型:mightyWeapon
-
动作:携带
-
资源定位器:Camelot
现在,为了解决这个权限检查,我们获取了 arthur 的所有成员记录。也就是说,他所属的每个组织和所应用的角色。我们有两个:
- 卡米洛特国王
- 圆桌骑士
对于每一个,我们都会尝试解决权限问题。对于第一个,我们知道国王可以携带属于同一组织或其他任何组织的强大武器。 Excalibur 属于 Camelot,arthur 作为King 也是如此,所以他可以携带它们。我们将在这里停止检查,并且权限的解决方案是肯定的。
现在,让我们检查一下 galahad 是否可以携带 Excalibur。他拥有以下会员资格:
- 卡姆利奥特骑士
- 圆桌之王
对于第一个,我们没有任何许可告诉我们骑士可以携带强大的武器,所以我们继续解决。
对于第二个,我们知道国王可以携带强大的武器,但 Excalibur 与扮演国王的 Galahad 不在同一级别,也不属于任何一个下属组织,因为 RoundTable 本身就是 Camelot 的下属组织。因此,此权限检查结果是否定的。
就是这样。我希望这个例子能澄清一点。当然,我有很多范围可以使这更完整,但这是我想出的最佳解决方案。欢迎提出任何改进建议。