分层角色/权限基础访问控制

16
我想构建一个层级角色基础访问控制系统。 这是我目前的模式:

enter image description here

目前有两种选择来构建该系统:

  1. 将所有所需权限附加到一个角色上(非分层) enter image description here

  2. 只附加特殊的"级别"权限并继承具有较低级别的权限 enter image description here

是否有更好的方法还是只取决于我的项目需求?

我倾向于选择分层的原因仅仅是为了简单。如果这样做,是否有更好的方式来选择权限级别,比如使用二进制数?

选项2将为角色提供一些级别,我将为权限提供一些级别号码。因此,当我创建一个完全管理员时,该角色将继承所有其他权限,因为它的级别为4,而其他权限的级别号码小于4(或4000)。

这是否过度设计了?


1
不要将其变成层次结构,这会带来更多麻烦而不值得。相反,只需创建N个不同的“角色”(每个角色将表示其包含的权限作为单独的属性),并将一个或多个角色分配给每个用户。在多个角色的情况下,只需将权限展平为固定阶段即可。 - user2864740
1
我不明白为什么继承会带来麻烦。它似乎可以节省很多编码和实体访问的时间。 - al'ein
好的,你赢了。我没有看到 OP 说仅在数据库内处理这个问题。我来这里是因为 PHP 标签。 - al'ein
1
完全不需要。虽然使用非分层基础的#1,但用户可能只有一个角色也没有问题。如果考虑到这一点,系统仍然可以保持灵活性和简单性。但是权限聚合处理是按角色而不是按层次结构进行的。 - user2864740
@user2864740,我仍然不理解你的方法。你能否举个例子呢? - Cristian
显示剩余7条评论
1个回答

16
我建议选择“方法1”的一种变体——非分层角色。我曾在类似的系统中取得了巨大成功。虽然这种方法一开始可能看起来比较松散,但它相对简单且非常灵活,特别是在允许多个用户角色并定义聚合权限规则时。
反对使用分层(而不是角色)的原因之一是,就像“OO分层”一样,使用角色分层会导致严格的替换关系。这使得基于不断变化的需求来定义角色更加困难。例如,也许将来需要一个“管理员”账户,但该账户不能创建自己的帖子。由于“完全管理员”是“付费用户”,所以分层结构(及其具有的替换关系)会阻止此操作而不改变树结构本身。
针对真正的分层结构的查询在SQL中更加复杂,尤其是在不支持递归查询的实现中,如MySQL。切换到使用嵌套集或物化方法的分层会强制增加额外的结构,而不仅仅是父子关系。
您不需要它; 软件越复杂,编写和维护就越困难。虽然在某些情况下层次结构非常好用——例如在物料清单、家谱或目录结构中——但在大多数角色/组权限模型中根本没有“需要”。
对于(多)角色
没有“父类型”依赖关系的角色更像“OO接口”——如果比喻要被拉伸,那么Trait composition可能更合适。每个角色的实现(即授予的权限)可以独立于任何其他角色而进行更改,使其极其灵活。与接口一样,可以将多个角色分配给给定的用户/实体。
针对平面用户<M-M>角色<M-M>权限模型的查询在SQL中(带或不带递归支持或附加结构)更简单,因为根本没有需要遍历的角色层次结构。

Windows ACL Groups(忽略嵌套组)与角色非常相似;用户属于一个或多个组,该组授予权限(或拒绝权限,但这是不同的情况)。

既要有蛋糕,还要吃蛋糕

我建议采用上述提到的变化,允许在角色之间进行权限聚合。一个简单的聚合模型如下:

  • 用户从分配给他们的所有角色中获得联合权限。

    (有效权限通常会在授权期间生成,但没有层次结构,也可以通过SQL查询相对简单地生成。)

因此,权限被绑定到每个角色,几乎没有重叠,如“方法#2”所示,其区别在于:没有层次结构

例如,为了允许一个特殊管理员搜索帖子(并删除“不良”帖子),只需分配“基本用户”“有限管理员”角色1

使用一个非分层的多角色系统可以使其更加清晰,摆脱分层的负担,同时提供灵活/可组合/可配置的角色原型。

1 这并不是一个特别好的例子。实际上,角色应该有不同的名称(例如“账户支持”或“内容审核员”),并且涵盖不同的权限集;这些权限集可能会根据试错和时下的业务规则而随时间变化。

虽然我反对为此类系统建立等级制度,但在更复杂的系统中,可能需要允许角色之间的关系,主要用于分组。这种关系通常应该是独立于有效权限的存在,用于其他管理目的。


2
谢谢您的见解。不采用分层结构确实很有道理。 "几乎没有重叠" 结合 "联合" 真的非常适合我的当前项目。在您提到的 "特殊管理员" 的示例中,在分配了 "基本用户" 和 "有限管理员" 角色之后,特殊管理员将不具备付费用户的权限。这完全合理。是的,在某些情况下,分层角色可能有效,但这意味着权限和角色不会(或许只会稍微)随时间改变。而这并不适用于我的情况,因为我的项目可能会有很多变化。 - Cristian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接