【问题标题】:Designing an advanced permission system [closed]设计一个高级权限系统[关闭]
【发布时间】:2016-01-01 02:00:42
【问题描述】:

我目前想要实现一个权限系统,这样可以方便地在生活中添加权限(通过在 MySQL 中使用行而不是字段)。每个权限将有 5 位:查看、添加、删除、修改、值。我会举一些例子来更好地解释这个结构。问题是,有了这个系统,我希望能够授予管理员 GIVE 权限以及授予普通用户执行各种任务的权限。

示例 1:

论坛

方法 1)

会有一个权限叫做 can_create_topic 和 can_modify_topic_name 和 can_delete_own_topic ETC ETC

方法 2)

会有一个称为主题的权限,它会有子权限或位:添加、修改、查看、删除。我更喜欢这种方法,只是不知道如何实现。

示例 2:

我还想授予用户除了是或否权限之外的权限,例如 max_number_of_topics_per_hour,它是一个输入值。

示例 3:

我想授予其他管理员(比如我是超级管理员)关于授予权限的权限。例如,一位管理员可以为 UserA 修改 can_create_topic,但不能为 UserB 修改,依此类推。我该怎么做?

【问题讨论】:

  • SO 不适用于设计讨论。您需要就您编写的代码提出具体问题,以获得帮助使其正常工作。
  • 我发现了其他与我的问题相似但不一样的问题
  • 你可以在 SO 的表弟programmers 处尝试这个问题
  • @davejal 这个问题可能会因为“太宽泛”而被关闭,因为它不是询问设计问题,而是列出一些要求,然后要求我们从刮。此外,与评论相比,更喜欢标记版主迁移,因为带有链接的 cmets 往往会导致交叉发布。
  • 是的,我将其标记为广泛,因为无法将其标记为离题并且属于堆栈交换上的另一个站点。

标签: mysql permissions


【解决方案1】:

很抱歉在这里写出不属于代码的解决方案。

我正在为我的项目使用这个解决方案

你需要创建 6 个表

  • 用户角色(ID、姓名、状态)
  • 用户(ID、姓名、电子邮件、密码、user_role_id、状态)
  • 权限实体(id、entity_name、状态)
  • 权限规则(id、entity_name_id、rule_name、status)
  • 用户角色权限(id、user_role_id、permission_rule_id、rule_value)
  • 用户权限(id、user_id、permission_rule_id)

这样,

  • 您可以添加表名等实体。
  • 您可以添加与实体相关的规则,还可以添加 Create、Update、Delete、Read、PerHourRecords 等等
  • 您可以设置规则值,例如实体论坛的每小时记录为 100。否则 rule_value 将为空
  • 您可以根据用户角色设置权限,例如所有管理员都拥有这些权限,所有编辑者都拥有这些权限
  • 此外,您可以为特定用户设置权限,通常所有编辑都有权为博客实体每小时提交 10 个帖子,但 User1 可以提交 12 个。

当然,你需要为这些设置做接口

【讨论】:

  • 不错!你不需要用户权限中的规则值吗?你能给我一个关于状态的例子吗?
  • rule_value 仅用于添加限制,例如 recordsPerHour 将为 10 或您想要限制的其他值。关于状态,这仅用于启用或禁用,就像您为 FORUM 实体创建 CRUD 规则一样。但是几天后您认为 DELETE 不应该是权限的一部分(想要保留所有记录),那么您可以禁用 DELETE 规则。所以在实体论坛里,会有CRU规则。
  • 我知道,但你写道:userrolespermissions (id, user_role_id, permission_rule_id, RULE_VALUE) 意味着用户角色(超级管理员、管理员、成员、访客)可以有特定的规则,不是是/否增删改查。但是用户权限呢?他们不需要一个名为 rule_value 的字段吗?
  • 好吧,由你决定。您可以在 userrolespermissions 和 userpermissions 中添加 rule_value。如果您想根据 userRoles 给出一些特定的值,那么您需要 userrolespermissions 中的 rule_value。与用户权限相同。
  • 权限实体和权限规则有什么区别?能举个例子吗?