基于分层角色/权限的访问

时间:2015-08-26 17:51:18

标签: php mysql permissions hierarchical role-based-access-control

我想构建一个Hierarchical Role Base访问控制。 这是我目前的架构:
enter image description here

目前我有两个选项来构建这个系统:

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

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

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

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

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

    这有多大意义吗?

1 个答案:

答案 0 :(得分:7)

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

我与类似系统合作取得了巨大成功。虽然起初这种方法可能看起来结构较差'它相对简单,非常灵活; 允许多个每用户角色并定义聚合权限的规则时。

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

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

例如,未来可能需要管理员' 无法创建自己的帖子的帐户。层次结构(以及它具有的替换关系)在不改变树结构本身的情况下阻止了这种情况,因为"完全管理员"是一个"付费用户"。

针对真正的层次结构的查询在SQL中更复杂;特别是在不支持递归查询的实现中,比如MySQL。使用嵌套集或物化方法切换到层次结构会强制只有父子关系的附加结构。

你只是不需要它;更复杂的软件更难以编写和维护。虽然在某些情况下层次结构非常好 - 例如使用物料清单或族谱或目录结构 - 但根本不需要'在大多数角色/组权限模型中。

对于(多)角色

角色,没有'父类型'依赖性,功能更像是&#OO接口' - 好吧,如果类比要被拉伸,也许Trait composition会更合适。每个角色的实现(读取:授予权限)可以更改任何其他角色的独立,使其非常灵活。和接口一样,可以为给定的用户/实体分配多个角色。

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

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

你的蛋糕也吃了

我推荐的变体,并且已经暗示过上面的内容,是允许跨角色聚合权限。一个简单的聚合模型是:

  • 用户拥有所有权限的并集,分配了角色。

    (有效权限通常在授权期间构建,但没有层次结构,在SQL中查询也相对简单。)

因此权限是按角色绑定的,很少或没有重叠,如#34;方法#2&#34;中显示的那样:没有层次结构

例如,要允许可以搜索帖子的特殊管理员(以及删除错误的帖子),只需分配&#34;基本用户&#34; &#34;有限管理员&#34;角色 1

使用非分层多角色功能系统可以干净利落地摆脱层次结构的负担,同时仍然提供灵活/可组合/可配置的角色原型。

1 这不是一个特别好的例子。实际上,角色应该有不同的名称(例如,&#34;帐户支持&#34;或&#34;内容主持人&#34;)并涵盖不同的权限集;这些可能会随着时间的推移而变化,这取决于反复试验和错误的月度业务规则。

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