如何实现基于组和角色的权限系统?

Posted

技术标签:

【中文标题】如何实现基于组和角色的权限系统?【英文标题】:How to implement a group & role based permission system? 【发布时间】:2014-08-02 17:46:39 【问题描述】:

我目前正在使用 Symphony 2 库在 php 中构建应用程序,但我想这个问题适用于任何类型的 Web 应用程序。这是我想要实现的基本基础架构:

每个用户都属于一个或多个组 每个组都实现一个或多个角色 组实施的角色适用于该组中的所有用户 用户可以实现不在其组中的其他角色

一个例子

“作者”组实现“作者”角色和“评论版主”角色 “管理员”组实现了“管理员”角色 用户“Henry”是作者组和管理员组的成员 用户“Henry”实现了“所有者”角色

对该用户有效的角色是“作者”、“评论版主”、“管理员”和“所有者”。

编辑

这种行为是否是一种好习惯:用户可以从自己的组继承角色,也可以拥有个人角色。 如果是这样,如何使它成为现实?

我想到了 5 张桌子:

用户

身份证 姓名

角色

身份证 姓名

用户角色

id_user (FK) id_role (FK)

身份证 姓名

组角色

id_group (FK) id_role (FK)

用户组

id_user (FK) id_group (FK)

这可能有效,主要问题是防止添加用户已从其所属的组中拥有的个人角色。

这似乎有点复杂。有没有更好的方法呢?

谢谢

【问题讨论】:

那么...问题是什么?看来您已经计划好了,那么您需要我们帮助的哪一部分? 编辑了我自己的帖子 ;) 您基本上在那里描述了一个相当正常的系统,并且已经制定了您将拥有的正常表。用户在他们的组中也有角色是否有问题?这真的有区别吗?他们有这个角色,不管他们从哪里得到这个角色,或者他们是否有两次角色——如果他们有,他们就有了。 好的,以这种方式实现它不是一个令人窒息的事情吗?人家是这样的吗? 最常见的论坛系统之一 (phpBB) 正是这样做的,而且非常高兴。要记住的主要事情是确保您正确地制作查询和表(索引)以保持最佳速度。 【参考方案1】:

您所描述的是一个相当正常和常见的权限系统。它是一种在世界范围内以多种不同形式使用的系统。事实上,您很可能只是通过使用此网站以某种类似的形式使用它。当然,如果您曾经使用过使用 phpBB 的论坛,那么您一定会使用它。

您描述的表格非常标准。一个用户,许多组,一个表来链接它们。一个用户,许多角色,一个表来链接它们。一组,许多角色,一张表将它们联系起来。都是很标准的东西。

对于负载较重的系统,主要的警告是确保您的表和查询得到优化,以降低服务器负载。这意味着确保您在正确的列上有索引,等等。mysql 命令explain 可以真正帮助您检查是否正确。

还有其他类似的方法可以使用更少的表实现相同的结果,在某些情况下可能更优化,也可能不太理想,这完全取决于您的系统。最常见的方法是基本上将连接表压缩到“单个”端表中的单个字段中,因此用户将有一个包含角色列表的字段,另一个包含组列表的字段它。与组类似 - 一个包含角色列表的字段。如何对这些信息进行编码取决于您。我通常使用 JSON 将数组信息编码到表字段中,因为它是自转义的。它所做的只是将处理从 SQL 服务器转移到接口脚本。

如果一个用户具有相同的角色,无论是单独授予还是从组继承,这是否重要?它不应该。如果一个角色由一个标志组成,该标志表示用户被允许(或不允许)执行特定功能,并且他们两次获得该标志,他们是否拥有更多标志?标志可以关闭、打开还是更多?不正常,不。你必须不遗余力地编写一个可以像那样工作的系统。

更有趣的是,当您有两个角色发生冲突时会发生什么 - 一个说他们可以做某事,一个说他们不能做某事。你选择哪一个 - 让他们这样做的那个还是阻止他们这样做的那个?当然,这完全是你的选择。顺便说一句,phpBB 有 3 种状态的权限 - YES、NO 和 NEVER。 YES 可以覆盖 NO,但不能覆盖 NEVER。

【讨论】:

你写的东西让我更容易理解!非常感谢@Majenko。我会按照我在问题帖子中写的方式来做。【参考方案2】:

你说的是RBAC。它可以通过例如PHP-RBAC 来实现。对于 Symphony,我找到了 UserRbac。

【讨论】:

我知道这个讨论有点老了,但如果有人寻找维护的 rbac 库,我想建议我自己的:github.com/doganoo/simple-rbac

以上是关于如何实现基于组和角色的权限系统?的主要内容,如果未能解决你的问题,请参考以下文章

基于角色的权限管理系统

如何在 Spring Boot 中实现基于角色权限的系统

C 实现基于角色的权限系统

使用.NET从零实现基于用户角色的访问权限控制

系统设计:基于角色的权限管理设计实现

基于Flask实现后台权限管理系统 - 高清图