网站权限系统的最佳实践

5
我正在开发一个网页应用程序,需要在多个客户的服务器上交付。该网站需要一个权限控制系统,以管理用户可以或不可以使用的区域和功能。
目前,我正在设计一个基于数据库的权限系统,将权限存储在数据库中。每个用户都有一个角色,角色定义了可用的权限列表。架构如下:
users
1. user_id
2. name
3. role_id
roles
1. role_id
2. name
permissions
1. permission_id
2. name
roles_permissions 表:
1. role_id
2. permission_id
在代码中,我会获取已登录用户的角色和权限,并检查用户是否能够执行操作或查看区域,如下所示:
if($user->hasPermission('Edit HR')) {
  // let user see the editing HR section
}

hasPermission函数会检查用户是否拥有名为“Edit HR”的权限,并返回所需结果。问题在于,数据库表必须具有名称完全为“Edit HR”,而不是“Edit_hr”或“HR Editing”的权限记录。因此,我必须确保权限系统的数据在应用程序使用的每个数据库中都相同。这使我想到这是一个有缺陷的设计,需要重新设计。创建新的部分和功能也需要更新所有数据库,这让我感到非常沮丧。
因此,基本上问题是:如何最好地设计基于数据库的权限系统,并在多个数据库上保持数据库完整性?

为了澄清设计,我会将表称为“角色”、“资源”和“权限”。权限表将包括对“role_id”和“resource_id”的外键引用,如果存在任何条目,则可以知道该角色与该资源相连。此外,我会将每个主键称为“id”,因为您已经有名为“[table]_id”的外键。 - Xeoncross
用户只能有一个角色吗?那么如果有人在一个类别中是编辑,而在另一个类别中是评论员呢? :) - Ja͢ck
这很好,问题在于当您混合角色、进程时,您需要解释用户是否需要向一个用户或用户组添加更多权限,或者仅从一个用户中排除权限。您是否想要使用此方案:http://stackoverflow.com/questions/37466333/php-mysql-sesion-good-practice-user-management-and-permissions - user6079755
2个回答

3
您提出的方案看起来很好。唯一需要补充的是在permissions表中,我会添加一个名为tag或类似名称的字段。
权限tag将是像EDIT_HR这样的内容,并且您将使用它作为代码中的参考,而不是使用其name。只需将name用于显示目的,例如HR Editing。这样,名称可以根据需要变化,而不会影响您的代码。

0
我使用的解决方案是拥有一个全局$current_user对象,它在创建时读取权限表并存储适用于它的所有权限操作。每当需要检查操作时,就会搜索此数组。这样可以节省数据库查询,尽管如果在全局对象中存储此类数据存在安全隐患,我还没有发现它。
只需要一个数据库表(示例):
user_id | user_role | user_action
---------------------------------
0       |   10      |   view_dashboard
0       |   1       |   view_users

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接