【问题标题】: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) 正是这样做的,而且非常高兴。要记住的主要事情是确保您正确地制作查询和表(索引)以保持最佳速度。

标签: php roles


【解决方案1】:

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

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

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

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

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

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

【讨论】:

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

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

【讨论】:

猜你喜欢
  • 2016-11-09
  • 2021-09-16
  • 2013-10-03
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2011-12-13
相关资源
最近更新 更多