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

Ryb*_*bus 4 php roles

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

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

一个例子

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

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

编辑

具有这种行为是否是一种好的做法:用户可以从其自己的组继承角色,也可以具有单独的角色.如果是这样,如何让它成为现实?

我想到了5个表:

用户:

  • ID
  • 名称

作用:

  • ID
  • 名称

UserRole:

  • id_user(FK)
  • id_role(FK)

:

  • ID
  • 名称

GroupRole:

  • id_group(FK)
  • id_role(FK)

用户组:

  • id_user(FK)
  • id_group(FK)

这可能有效,主要问题是阻止用户从其所属的组中添加单个角色.

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

谢谢

Maj*_*nko 6

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

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

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

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

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

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