如何实施一个小组&基于角色的权限系统?

时间:2014-06-12 11:56:17

标签: php roles

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

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

一个例子

  • 一组'作家'实施'作家'角色和'评论主持人'角色
  • “管理员”组实施“管理员”角色
  • 用户'Henry'是编写组和管理员组的一部分
  • 用户'Henry'实施'所有者'角色

对该用户有效的角色是“作家”,“评论主持人”,“管理员”和“所有者”。

修改

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

我想到了5张桌子:

用户

  • ID
  • 名称

角色

  • ID
  • 名称

UserRole

  • id_user(FK)
  • id_role(FK)

群组

  • ID
  • 名称

GroupRole

  • id_group(FK)
  • id_role(FK)

UserGroup

  • id_user(FK)
  • id_group(FK)

这可行,主要问题是阻止用户从其所属的群组中添加个人角色。

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

由于

2 个答案:

答案 0 :(得分:6)

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

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

系统负载较重的主要警告是确保您的表和查询以保持服务器负载的方式进行优化。这意味着确保在正确的列上有索引等.MySQL命令explain可以帮助您检查是否正确。

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

如果用户具有从组中单独授予和继承的相同角色,这是否重要?它不应该。如果某个角色包含一个标志,该标志表示允许(或不允许)用户执行特定功能,并且他们获得该标志两次,那么他们是否拥有更多的标志?旗帜可以关闭,打开等等吗?不通常,不。你必须不遗余力地编写一个像这样的系统。

当你有两个冲突的角色时,会发生什么更令人感兴趣的事情 - 一个说他们可以做某事而另一个说他们不能做。你选择哪一个 - 让他们这样做的人还是阻止他们这样做的人?当然,这完全是您的选择。顺便说一下,phpBB有3个状态用于许可 - 是,否,从不。 YES可以覆盖NO,但不能覆盖NEVER。

答案 1 :(得分:0)

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