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

4
我目前正在使用Symfony 2库构建PHP应用程序,但我认为这个问题适用于任何类型的Web应用程序。这是我想要实现的基本架构:
- 每个用户都是一个或多个组的一部分 - 每个组实施一个或多个角色 - 组实施的角色适用于该组中的所有用户 - 用户可以实施其组中没有的其他角色
一个例子:
- 一个名为“写手”的小组执行“作者”角色和“评论审核员”角色 - 一个名为“管理员”的小组执行“管理员”角色 - 用户“Henry”是“writer”组和“administrator”组的成员 - 用户“Henry”实施了“owner”角色
对该用户有效的角色将是'writer','comment moderator','administrator'和'owner'。
编辑:
用户能够从其所在的组继承角色并且也能够拥有自己的角色,这种行为好不好?如果是,如何实现?
我考虑了5个表:
Users:
- id - name Role:
- id - name UserRole:
- id_user(外键) - id_role(外键)
Group:
- id - name GroupRole:
- id_group(外键) - id_role(外键)
UserGroup:
- id_user(外键) - id_group(外键)
这可以工作,主要问题是防止用户从它所属的组中添加已有的个人角色。
但是这看起来有点复杂,是否有更好的方法?谢谢。

那么...问题是什么?看起来你已经在脑海中计划好了一切,那么你需要我们帮助的部分是什么? - Majenko
编辑了自己的帖子 ;) - Rybus
你基本上描述了一个相当正常的系统,并且已经确定了你将拥有的正常表格。用户在其组中具有角色是否存在问题?那真的有什么区别吗?他们拥有这个角色,无论他们从哪里获得这个角色,或者他们是否有两个角色 - 如果他们拥有它,他们就拥有它。 - Majenko
好的,我明白了,谢谢! - Rybus
1
最常见的论坛系统之一(phpBB)正是这样做的,而且它非常出色。记住的主要事项是确保您正确地构建查询和表(索引),以保持速度最优。 - Majenko
显示剩余2条评论
2个回答

6
您所描述的是一个非常普通和常见的权限系统。这种系统在世界各地以许多不同形式使用。事实上,您很可能正在使用某个类似的系统来使用此网站。如果您曾经使用过基于phpBB的论坛,那么您肯定已经使用过它。
您描述的表格几乎是标准的。一个用户,多个组,一张表将它们连接起来。一个用户,多个角色,一张表将它们连接起来。一个组,多个角色,一张表将它们连接起来。这些都是非常标准的内容。
在更繁忙的系统中,主要的注意点是确保您的表格和查询被优化以使服务器负载降低。这意味着确保在正确的列上具有索引等。MySQL命令“explain”可以帮助您检查是否正确。
还有其他类似的方法可以使用较少的表格来实现相同的结果,在某些情况下可能更为优化,或者可能不太优化,这完全取决于您的系统。最常见的方法是将连接表压缩到“单个”结束表中的单个字段中,因此用户将具有包含角色列表的字段和包含组列表的另一个字段。类似地,对于组-具有角色列表的字段。如何编码该信息由您决定。我通常使用JSON将数组信息编码到表字段中,因为它是自我转义的。不过,它只是将处理从SQL服务器转移到接口脚本。
如果用户既通过个人授权又通过组继承具有相同的角色,那么这是否重要?不应该。如果一个角色由标志组成,表示用户被(或未被)允许执行特定功能,并且他们两次获得该标志,那么他们是否拥有更多的标志?标志可以关闭、打开和更多吗?通常不是,不需要编写类似的系统。
更有趣的是当您有两个相互冲突的角色时会发生什么-一个表示他们可以做某事,而另一个则表示他们不能做。你选择哪个-让他们做还是停止他们做?当然完全取决于你。顺便说一下,phpBB对权限有3种状态-是、否和永远不是。是可以覆盖否,但无法覆盖永远不是。

你真的为我写了一些很容易理解的东西!非常感谢@Majenko。我会按照我在问题帖子中写的方式去做。 - Rybus

0

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


我知道这个讨论有点旧了,但是如果有人正在寻找一个维护良好的rbac库,我想建议我的:https://github.com/doganoo/simple-rbac - Doğan Uçar

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