【问题标题】:Best practices for website permissions system网站权限系统的最佳实践
【发布时间】:2012-06-09 16:20:30
【问题描述】:

我正在处理的当前项目是一个 Web 应用程序,它必须在他们自己的服务器上交付给多个客户。该网站需要一个权限控制系统,该系统将管理用户可以或不可以使用的区域和功能。
据了解,我正在设计一个数据库驱动的权限系统,权限存储在数据库中。每个用户都有一个角色。该角色定义了可用的列表权限。架构如下所示:

用户
1. user_id
2.名称
3.role_id

角色
1. 角色ID
2.名字

权限
1.permission_id
2.名字

roles_permissions 表:
1. 角色ID
2.permission_id

在代码中,我将获取登录用户的角色和权限,并检查用户是否能够执行操作或查看如下区域:

if($user->hasPermission('Edit HR')) {
  // let user see the editing HR section
}

hasPermission 将检查用户是否拥有名为“Edit HR”的权限,并将返回所需的结果。我看到的问题是数据库表必须具有名称为“Edit HR”而不是“Edit_hr”或“HR Editing”的权限记录。所以我必须确保权限系统的数据对于应用程序使用的每个数据库都是相同的。哪一种让我觉得这是一个有缺陷的设计,需要重新设计。创建新的部分和功能还需要更新所有数据库,这也让我很伤心。

所以,基本上,问题是:设计数据库驱动的权限系统并在多个数据库上保持数据库完整性的最佳方法是什么?

【问题讨论】:

  • 为了阐明设计,我将表称为roleresourcepermission。权限表将包括role_idresource_id 的外键,如果存在任何条目,则您知道该角色已连接到该资源。另外,我会将每个 PK 称为 id,因为您已经拥有名为 [table]_id 的 FK。
  • 用户只能拥有一个角色?一个类别的编辑和另一个类别的审稿人怎么样? :)
  • 这很好,问题是当您混合角色、进程并且您需要解释用户是否需要向一个用户或用户组添加更多权限或仅排除一个用户的权限时,会你喜欢这个方案:stackoverflow.com/questions/37466333/…

标签: php permissions web


【解决方案1】:

您提出的方案看起来不错。我唯一要添加的是在permissions 表上,我会添加一个名为tag 或类似的字段。

权限tag 类似于EDIT_HR,您可以在代码中使用它作为引用而不是它的name。仅将name 用于显示目的,例如HR Editing。这样名称可以根据需要变化,并且不会影响您的代码。

【讨论】:

    【解决方案2】:

    我正在使用的解决方案是拥有一个全局 $current_user 对象,该对象在创建时读取权限表并存储对其有效的所有权限操作。每当您需要检查操作时,就会搜索此数组。它节省了数据库查询,但如果将此类数据存储在全局对象中存在安全隐患,我还没有找到。

    只需要 1 个 db 表(示例):

    user_id | user_role | user_action
    ---------------------------------
    0       |   10      |   view_dashboard
    0       |   1       |   view_users
    

    用户角色对应于最低用户类型(管理员、编辑、访问者等),因此所有具有 user_role >= $current_user 角色的操作都可用。 user_id 列允许您覆盖特定用户的某些级别。

    通过这种设置,也很容易拥有一个列出所有权限的页面,并允许用户通过简单的下拉菜单修改值(但要确保不是每个用户都可以这样做)。

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2014-05-31
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2011-04-23
      • 2010-09-21
      • 2010-11-10
      • 2011-06-09
      相关资源
      最近更新 更多