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

Posted

技术标签:

【中文标题】我可以将 Apache Shiro 用于分层用户模型吗?【英文标题】:Can I use Apache Shiro for a hierarchical user model? 【发布时间】:2015-01-10 08:23:35 【问题描述】:

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

所以,我想知道是否有一种方法可以使 Apache Shiro 适应这种层次结构,我可以在其中为组织中的角色定义权限,这意味着,不仅仅是拥有可以对任何角色执行任何操作的“管理员”角色用户,而是“组织 A”的“管理员”,可以对属于“组织 A”或其任何子组织的任何用户执行任何操作。

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

users:*:organizationA/*

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

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

【问题讨论】:

您解决了这个问题吗?如果是这样,您能分享一下方法吗? 【参考方案1】:

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

Role:ResourceType:Action:Scope

所以权限被定义为:“这个角色,在这种类型的资源上,可以执行这个动作”。并将该定义与层次结构相关联,因此,要知道如何使用角色来解决这个问题,我有范围。范围告诉我们权限何时适用,它与层次结构直接相关。

我假设我可以使用定位器将任何资源放置在层次结构中。就我而言,定位器是用户或组织。我知道这很复杂(或者可能不是,我只是解释得很糟糕),所以让我们来看一个例子。

我有这个层次结构:

组织:卡米洛特 国王:亚瑟 骑士:加拉哈德 组织:圆桌会议 国王:加拉哈德 骑士:拉莫拉克

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

king:mightyWeapon:carry:sameBelow

这种情况下的范围是 sameBelow,它告诉我们这适用于国王所属的同一组织或该组织的任何子组织。

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

现在让我们检查一下用户 arthur 是否可以携带 Excalibur。因此,权限解析中涉及的变量将是这些:

用户:亚瑟 资源类型:mightyWeapon 动作:携带 资源定位器:Camelot

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

    卡米洛特国王 圆桌骑士

对于每一个,我们都会尝试解决权限问题。对于第一个,我们知道国王可以携带属于同一组织或其他任何组织的强大武器。 Excalibur 属于 Camelotarthur 作为King 也是如此,所以他可以携带它们。我们将在这里停止检查,并且权限的解决方案是肯定的。

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

    卡姆利奥特骑士 圆桌之王

对于第一个,我们没有任何许可告诉我们骑士可以携带强大的武器,所以我们继续解决。

对于第二个,我们知道国王可以携带强大的武器,但 Excalibur 与扮演国王的 Galahad 不在同一级别,也不属于任何一个下属组织,因为 RoundTable 本身就是 Camelot 的下属组织。因此,此权限检查结果是否定的。

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

【讨论】:

【参考方案2】:

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

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

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

globalPermissionResolver = com.foo.bar.MyPermissionResolver

在此处查看文档:https://shiro.apache.org/authorization.html#Authorization-Configuringaglobal%7B%7BPermissionResolver%7D%7D

【讨论】:

听起来很有希望。由于我仍在研究,我会让你知道这是怎么回事。谢谢!

以上是关于我可以将 Apache Shiro 用于分层用户模型吗?的主要内容,如果未能解决你的问题,请参考以下文章

Cas(用于身份验证)+ OpenLDAP(用于用户名、密码+角色和权限)+ Apache Shiro(用于授权)

Apache Shiro - 用于身份验证和属性的 LDAP/用于授权的 Ini

Apache Shiro 使用手册Realm 实现

用于保护 REST api 的 Apache Shiro

我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色

Apache Shiro:您将如何管理用户?