基于分层 role/permissions 的访问

Hierarchical role/permissions based access

我想构建分层角色库访问控制。 这是我当前的架构:

目前我有两种构建这个系统的选择:

  1. 将所有必需的权限附加到角色(非分层)

  2. 只附加特殊的"level"权限并继承较低级别的权限

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

因为简单,我倾向于选择Hierarchical。如果我这样做,是否有更好的方法来选择权限级别,也许使用二进制数?

选项 2 会有一些角色级别,我会有一些权限级别。因此,当我创建 Full Administrator 角色时,该角色将继承所有其他权限,因为那将是 4 级,而其他权限的数字将小于 4 级(或 4000)。

这是矫枉过正吗?

我建议使用“方法 #1”的变体 - 非分层 角色。

我使用过类似的系统并取得了巨大的成功。虽然一开始这种方法可能看起来 'less structured' 但它相对简单且非常灵活; 允许每个用户多个角色并定义聚合权限规则时。

反对层次结构(针对角色)

与 'OO hierarchy' 一样,使用角色层次结构会导致严格的替代关系。这使得根据不断变化的需求定义角色变得更加困难。

例如,也许将来需要一个 'Administrator' 帐户,该帐户 不能 创建自己的帖子。层次结构(及其具有的替代关系)在不更改树结构本身的情况下防止了这种情况,因为“完全管理员”是“付费用户”。

针对真实层次结构的查询在 SQL 中更为复杂;特别是在不支持递归查询的实现中,例如 MySQL。使用嵌套集或物化方法切换到层次结构会强制在父子关系之上添加一个额外的结构。

你只是不需要它;越复杂的软件就越难编写和维护。虽然层次结构在某些情况下非常好 - 例如 Material 或系谱或目录结构的法案 - 在大多数 Role/Group-Permission 模型中根本没有 'need'。

对于(多个)角色

角色,没有 'parent type' 依赖,功能更像 'OO interfaces' - 好吧,如果要扩展类比,也许 Trait composition 会更合适。每个角色的实现(阅读:授予的权限)可以改变任何其他角色的独立,使其非常灵活。和界面一样,可以将多个角色分配给给定的 User/entity.

针对平面 User <M-M> Role <M-M> Permission 模型的查询在 SQL 中要简单得多(有或没有递归支持,或附加结构)因为只有 no要遍历的角色层次结构。

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

吃蛋糕也吃

我推荐的 变体 是允许 权限聚合 跨角色。一个简单的聚合模型是这样的:

  • 一个用户拥有所有他们分配的角色的权限。

    (有效权限一般会在授权时建立,但没有层级在SQL查询也比较简单。)

因此,权限是按角色绑定的,几乎没有或没有重叠,如“方法 #2”中所示,区别在于:没有层次结构

例如,要允许一位可以搜索帖子(并删除 'bad' 帖子)的特殊管理员,只需分配“基本用户”“有限管理员”角色1.

使用 非分层 多角色系统允许这一点干净地摆脱层次结构的负担,同时仍然提供 flexible/composable/configurable 角色原型。


1 这不是一个特别好的例子。实际上,角色应该有不同的名称(例如“帐户支持”或“内容管理员”)并涵盖不同的权限集;这些可能会随着时间的推移根据反复试验和每月口味的业务规则而改变。

虽然我反对这样的层次结构,但在更复杂的系统中,可能需要允许角色之间的关系,主要是为了对角色进行分组。这种关系通常应 独立于 所应用的有效权限,存在于其他管理目的。