Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 网站权限系统的最佳实践_Php_Permissions_Web - Fatal编程技术网

Php 网站权限系统的最佳实践

Php 网站权限系统的最佳实践,php,permissions,web,Php,Permissions,Web,我目前从事的项目是一个web应用程序,它必须在自己的服务器上交付给多个客户。网站需要权限控制系统,该系统将管理用户可以使用或不能使用的区域和功能。 正如我所知,我正在设计一个数据库驱动的权限系统,权限存储在数据库中。每个用户都有一个角色。角色定义可用的列表权限。架构如下所示: 用户表格 1.用户id 2.名称 3.角色id 角色表格 1.角色id 2.名字 权限表格 1.权限\u id 2.名字 角色\u权限表格: 1.角色id 2.许可证号 在代码中,我将获取已登录用户的角色和权限,并检查用户

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

用户表格
1.用户id
2.名称
3.角色id

角色表格
1.角色id
2.名字

权限表格
1.权限\u id
2.名字

角色\u权限表格:
1.角色id
2.许可证号

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

if($user->hasPermission('Edit HR')) {
  // let user see the editing HR section
}
hasPermission将检查用户是否具有名为“Edit HR”的权限,并将返回所需的结果。我看到的问题是数据库表的权限记录的名称必须是“Edit HR”,而不是“Edit_HR”或“HR Editing”。因此,我必须确保应用程序使用的每个数据库的权限系统数据都相同。这让我觉得这是一个有缺陷的设计,需要重新设计。创建新的部分和功能还需要更新所有的数据库,这也让我很难过


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

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


权限
标记
类似于
EDIT\u HR
,您可以在代码中使用它作为引用,而不是它的
名称
。使用
名称
仅用于显示目的,例如
人力资源编辑
。这样,名称可以根据需要更改,并且不会影响您的代码。

我使用的解决方案是使用一个全局$current\u用户对象,该对象在创建时读取权限表,并存储对其有效的所有权限操作。然后,每当需要检查操作时,都会搜索此数组。它节省了DB查询的时间,尽管如果在全局对象中存储此类数据存在安全隐患,我还没有找到它

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

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


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

为了澄清设计,我将调用表
角色
资源
权限
。权限表将包括
role\u id
resource\u id
的外键,如果存在任何条目,则您知道该角色已连接到该资源。另外,我会调用每个PK
id
,因为您已经有了名为
[table]\u id的FK。用户只能有一个角色?一个类别的编辑和另一个类别的审阅者怎么样这很好。问题是,当您混合使用角色、进程时,您需要解释用户是否需要向一个用户或用户组添加更多权限,或仅从一个用户中排除权限,是否要将此方案集成:
user_id | user_role | user_action
---------------------------------
0       |   10      |   view_dashboard
0       |   1       |   view_users