我目前正在从事的项目是一个Web应用程序,必须在自己的服务器上交付给多个客户。该网站需要一个权限控制系统,该系统将管理用户可以或不能使用的区域和功能。
至于知道,我正在设计一个数据库驱动的权限系统,权限存储在数据库中。每个用户都有一个角色。该角色定义可用的列表权限。架构如下所示:
用户表
1. user_id
2. 名称
3. role_id
角色表
1. role_id
2. 名称
权限表
1. 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 编辑"。因此,我必须确保权限系统的数据对于应用程序使用的每个数据库都是相同的。这让我觉得这是一个有缺陷的设计,需要重新设计。创建新的部分和功能还需要更新所有数据库,这也使我成为一只悲伤的熊猫。
所以,基本上,问题是:设计数据库驱动的权限系统并保持多个数据库的数据库完整性的最佳方法是什么?
你想出的方案看起来不错。我唯一要添加的是,在permissions
表上,我会添加一个名为tag
或类似的字段。
权限tag
类似于 EDIT_HR
,您将使用它作为代码中的引用而不是其name
。仅将name
用于显示目的,例如 HR Editing
。这样,名称可以根据需要而变化,并且不会影响代码。
我使用的解决方案是拥有一个全局 $current_user 对象,该对象在创建时读取权限表并存储对其有效的所有权限操作。然后,每当您需要检查操作时,都会搜索此数组。它节省了数据库查询,尽管如果在全局对象中存储此类数据存在安全隐患,我还没有找到它。
只需要 1 个 db 表(示例):
user_id | user_role | user_action
---------------------------------
0 | 10 | view_dashboard
0 | 1 | view_users
用户角色对应于最低用户类型(管理员、编辑者、访问者等),因此具有 user_role>= $current_user 角色的所有操作都可用。user_id列允许您覆盖特定用户的某些级别。
使用这种设置,也很容易拥有一个列出所有权限的页面,并允许用户使用简单的下拉列表修改值(但请确保不是每个用户都可以这样做)。