网站权限系统的最佳做法

时间:2012-06-05 16:10:33

标签: php permissions web

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

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

角色
1. role_id
2.姓名

权限
permission_id
2.姓名

roles_permissions 表:
1. role_id
2. permission_id

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

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

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

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

2 个答案:

答案 0 :(得分:1)

你提出的计划看起来很好。我要添加的唯一内容是在permissions表格中我会添加一个名为tag或类似的字段。

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

答案 1 :(得分:0)

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

只需要1个db表(样本):

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

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

通过这种设置,还可以轻松拥有一个列出所有权限的页面,并允许用户通过简单的下拉列表修改该值(但请确保不是每个用户都可以这样做)。