mysql - 当基于角色的访问控制不够时,如何为用户分配角色和权限?

标签 mysql laravel database-design role-based-access-control

在 Laravel 应用程序中,我有 users , rolespermissions 。角色附属于用户,权限附属于角色。

用户:

id | name   | email
______________________
1  | saba   | saba@gmail.com
2  | nika   | nika@gmail.com
3  | gio    | gio@gmail.com

角色:

id | name  
______________________
1  | Admin   
2  | Client   
3  | Service_provider    

权限:

id | name  
______________________
1  | add_admin   
2  | delete_admin   
3  | approve_order
4  | delete_order 

用户角色:

id | user_id | role_id
______________________
1  | 1       | 1
2  | 2       | 2

角色权限:

id | role_id | permission_id
____________________________
1  | 1       | 1
2  | 1       | 2
3  | 1       | 3

在此示例中userid 1,是 Admin他可以add_admin , delete_admin , approve_order

但我需要不同的管理员拥有不同的权限。在这个结构中,如果我附加 admin角色为userid 2,他的权限与 user 相同与 id 1 有。

我需要不同的管理员拥有不同的权限,不同的客户端拥有不同的权限。

有一个小场景:

假设有两个用户AB,他们想注册为客户端,所以当他们注册时我会将客户端角色附加给他们。他们具有相同的权限,但如果用户A要上传他的文档,我需要将新权限附加给用户A,而不是用户B

我的解决方案是创建一个新表,在其中向用户附加权限

用户权限:

Id | user_id | permission_id
____________________________
1  | 1       | 4

因此用户的所有权限将是他的角色的权限+上面我描述的表中的权限

我需要决定这个解决方案是好是坏,或者是否有其他更好的方法。对于此类问题有最佳实践吗?

最佳答案

您可以考虑使用累积多角色方案

  1. 允许每个用户拥有一个有序的角色列表。

  2. 为每个需要一组特殊权限的用户创建自定义角色。

  3. 允许角色授予和撤回权限。

假设 Ann 和 Beatrice 都是管理员,但 Beatrice 不能删除订单。 假设Catherine不是管理员,但有权添加管理员。

当您可能设置这些角色时:

    Admin:  grant approve_order  grant delete_order  grant add_admin  grant delete_admin     
 Beatrice:  withdraw delete_order
Catherine:  grant add_admin

然后 Anna 拥有管理员角色。 Beatrice 具有管理员角色和她个人的 Beatrice 角色。凯瑟琳有她个人的角色。

经验告诉我,这样的系统非常灵活,但仍然足够简单,可以轻松地为许多用户处理标准用户配置。但是,很难审计——很难弄清楚您的自定义用户中谁拥有什么权限。如果您使用该系统几年,可能会感到非常困惑。

关于mysql - 当基于角色的访问控制不够时,如何为用户分配角色和权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53802314/

相关文章:

php - 如何获取数组中某些数组的值之和?

缺少参数的查询中的 PHP 错误

php - 如何将 Action 处理转发给 Laravel Controller 中的第二个 Action ?

ruby-on-rails - 单独的用户和帐户模型的优点/缺点是什么

android - 什么是最好的 : 1 table per record or 1 table with all records linked with foreign keys?

mysql - 如何优化需要 10 秒才能获取结果的 MySQL 查询

MySQL 转储到 SQL Server 2008 R2

mysql - 如何在 MySQL 表上拆分数据

php - Laravel 队列作业延迟执行

php - 在 Laravel 中使用模型的正确方法是什么?