网站权限系统的最佳做法

问题描述 投票:4回答:2

我正在开发的当前项目是一个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”。 因此,我必须确保权限系统的数据对于应用程序使用的每个数据库都是相同的。 哪种让我觉得这是一个有缺陷的设计,需要重新设计。 创建新的部分和功能还需要更新所有数据库,这也使我成为一个悲伤的熊猫。

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

php permissions web
2个回答
1
投票

你提出的方案看起来很好。 我要添加的唯一内容是在permissions表上我将添加一个名为tag或类似的字段。

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


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列允许您覆盖特定用户的某些级别。

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

© www.soinside.com 2019 - 2024. All rights reserved.