gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:43:18 26 4
gpt4 key购买 nike

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

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

一个例子

  • 一组“作家”扮演“作家”角色和“评论版主”角色
  • “administrators”组实现“admin”角色
  • 用户“Henry”是作者组和管理员组的一部分
  • 用户“Henry”实现“所有者”角色

对该用户有效的角色是“作者”、“评论版主”、“管理员”和“所有者”。

编辑

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

我想到了 5 个表:

用户:

  • 编号
  • 姓名

角色:

  • 编号
  • 姓名

用户角色:

  • id_user (FK)
  • id_role (FK)

:

  • 编号
  • 姓名

组角色:

  • id_group (FK)
  • id_role (FK)

用户组:

  • id_user (FK)
  • id_group (FK)

这可能行得通,主要问题是防止从用户所属的组中添加用户已有的个人角色。

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

谢谢

最佳答案

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

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

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

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

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

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

关于php - 如何实现基于组和角色的权限系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24183763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com