2014-06-12 52 views
3

我目前使用Symphony 2库在PHP中构建应用程序,但我想这个问题适用于任何类型的Web应用程序。这是基本的基础设施,我想实现:如何实现基于组和角色的权限系统?

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

一个例子不执行其他角色组

  • 一组“作家”落实“作家”的角色和“评论主持人”的角色
  • 一组“管理员”实现了“管理员”角色
  • 用户“亨利”是作家群体的一部分,和管理员组
  • 用户“亨利”实现了“所有者”角色

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

编辑

它是一个很好的做法还是不要有这种行为:用户可以从自己的组继承的角色,可以有个人的作用也是如此。 如果是这样,如何让它变成现实?

我认为5个表:

用户

  • ID

角色

  • ID

UserRole的

  • id_user(FK)
  • id_role(FK)

组:

  • ID

GroupRole

  • id_group(FK)
  • id_role(FK)

用户组

  • id_user(FK)
  • id_group(FK)

这可能是工作和存在的主要问题是防止添加用户已经从它所属的组的个人作用。

它似乎有点复杂。有没有更好的方法来做到这一点?

感谢

+0

那么......问题是什么?看起来你已经全部计划好了,所以你需要我们帮忙的是什么? – Majenko

+0

编辑我自己的帖子;) – Rybus

+0

你基本上是在描述一个相当普通的系统,并且已经制定了正常的表格。有一个角色也在他们的团队中的用户有问题吗?这真的有影响吗?他们有角色,无论他们从哪里获得角色,或者他们有两次角色 - 如果他们拥有角色都没有关系。 – Majenko

回答

5

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

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

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

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

如果一个用户具有同一个角色,并且从一个组中单独授予并继承,那么这很重要吗?它不应该。如果一个角色由一个标志表示用户是否允许执行特定功能,并且他们获得了该标志两次,他们是否拥有更多标志?一个国旗可以关闭,开启,还有更多功能吗?通常不,不。你必须走出自己的方式来设计一个可以这样做的系统。

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

+0

你无法写出更容易理解的东西!非常感谢你@Majenko。我会按照我在问题帖子中写的方式来完成。 – Rybus

0

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