[英]Best practices for website permissions system
我正在开发的当前项目是一个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”。 因此,我必须确保权限系统的数据对于应用程序使用的每个数据库都是相同的。 哪种让我觉得这是一个有缺陷的设计,需要重新设计。 创建新的部分和功能还需要更新所有数据库,这也使我成为一个悲伤的熊猫。
所以,基本上,问题是:设计数据库驱动的权限系统并在多个数据库上保持数据库完整性的最佳方法是什么?
你提出的方案看起来很好。 我要添加的唯一内容是在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列允许您覆盖特定用户的某些级别。
通过这种设置,还可以轻松拥有一个列出所有权限的页面,并允许用户通过简单的下拉列表修改该值(但请确保不是每个用户都可以这样做)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.