Php 如何实施一个集团&;基于角色的权限系统?

Php 如何实施一个集团&;基于角色的权限系统?,php,roles,Php,Roles,我目前正在使用Symphony 2库用PHP构建一个应用程序,但我想这个问题适用于任何类型的web应用程序。以下是我想要实施的基本基础设施: 每个用户都是一个或多个组的一部分 每个组实现一个或多个角色 组实现的角色适用于该组中的所有用户 用户可以实现不在其组中的其他角色 一个例子 一组“编剧”执行“编剧”角色和“评论主持人”角色 组“administrators”实现“admin”角色 用户“Henry”是writer组和administrator组的一部分 用户“Henry”实现“所有者

我目前正在使用Symphony 2库用PHP构建一个应用程序,但我想这个问题适用于任何类型的web应用程序。以下是我想要实施的基本基础设施:

  • 每个用户都是一个或多个组的一部分
  • 每个组实现一个或多个角色
  • 组实现的角色适用于该组中的所有用户
  • 用户可以实现不在其组中的其他角色
一个例子

  • 一组“编剧”执行“编剧”角色和“评论主持人”角色
  • 组“administrators”实现“admin”角色
  • 用户“Henry”是writer组和administrator组的一部分
  • 用户“Henry”实现“所有者”角色
该用户的角色将是“作者”、“评论主持人”、“管理员”和“所有者”

编辑 这种行为是一种好的做法还是不好:用户可以从自己的组继承角色,也可以有单独的角色。 如果是的话,如何让它成为现实

我想到了5张桌子:

用户

  • 身份证
  • 名字
角色

  • 身份证
  • 名字
用户角色

  • id_用户(FK)
  • id_角色(FK)

  • 身份证
  • 名字
组角色

  • id_组(FK)
  • id_角色(FK)
用户组

  • id_用户(FK)
  • id_组(FK)
这可能会起作用,主要问题是防止添加用户已从其所属的组中拥有的单个角色

看起来有点复杂。有没有更好的办法


谢谢你所说的。它可以通过以下方式实现:例如,通过。对于Symphony,我发现。

您所描述的是一个相当普通的权限系统。这是一个以多种不同形式在世界各地使用的系统。事实上,你很可能只是通过使用这个网站以类似的形式使用它。当然,如果你曾经使用过使用phpBB的论坛,你也会使用它

您描述的表格非常标准。一个用户、多个组、一个表来链接它们。一个用户,多个角色,一个表来链接它们。一个组,多个角色,一个表来链接它们。这些都是很标准的东西

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

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

如果一个用户同时拥有单独授予的和从组继承的相同角色,这有关系吗?不应该。如果角色由一个标志组成,该标志表示允许(或不允许)用户执行特定功能,并且他们两次获得该标志,那么他们是否有更多的标志?国旗可以关闭、打开或更多打开吗?不是正常情况,不。你必须千方百计地编写一个系统,这样做


更有趣的是当你有两个角色冲突时会发生什么——一个说他们能做什么,另一个说他们不能做什么。你会选择哪一个——让他们这么做的还是阻止他们这么做的?当然,这完全是你的选择。顺便说一句,phpBB有3个州需要许可-是、否和从不。“是”可以覆盖“否”,但不能覆盖“从不”。

所以。。。问题是什么?看来你已经把一切都计划好了,那么你想让我们帮你做什么呢?编辑我自己的帖子;)您基本上描述的是一个相当正常的系统,并且已经计算出了正常的表。用户组中的角色是否也存在问题?这真的有区别吗?他们有这个角色,不管他们从哪里得到这个角色,或者如果他们有两次这个角色——如果他们有这个角色,他们就有了这个角色。好吧,这样实现这个角色不是一种阻碍?人们就是这样做的吗?一个最常见的论坛系统(phpBB)就是这样做的,它非常开心。要记住的主要事情是确保您正确地设计查询和表(索引),以保持最佳速度。您不可能编写更容易让我理解的内容!非常感谢@Majenko。我会按照我在问题帖子中写的方式来做。我知道这个讨论有点过时,但如果有人寻找维护过的rbac库,我想提出我自己的建议: