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

时间:2018-12-16 12:52:53

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

在laravel应用程序中,我有usersrolespermissions。角色附加到用户,权限附加到角色。

用户:

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 

User_roles:

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_admindelete_admin,{{1 }}

但是我需要不同的管理员来拥有不同的权限。在此结构中,如果我将approve_order的{​​{1}}角色附加到admin 2 ,则他的权限将与user的{​​{1} } 1 有。

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

有一个小场景:

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

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

用户权限:

id

因此,用户的所有权限将是其角色的权限+我在上述表中的权限

我需要你们帮助我确定此解决方案的好坏,或者还有其他更好的方法吗? (这种问题的最佳做法是什么?)

3 个答案:

答案 0 :(得分:0)

好问题...您可以在不创建新表User_permissions的情况下,为具有不同权限的另一个客户端设置新角色

答案 1 :(得分:0)

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

  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)角色。凯瑟琳扮演着自己的角色。

经验告诉我,这样的系统非常灵活,但是仍然足够简单,可以轻松地为许多用户处理标准用户配置。但是,很难进行审核-很难确定您的自定义用户中谁拥有哪些特权。如果您使用该系统几年,可能会非常混乱。

答案 2 :(得分:0)

您可以考虑使用模板方案。为每个角色创建模板用户,并提供所需的权限列表。

然后,在添加新用户时,选择正确的角色模板,然后为用户分配与模板相同的权限。如果他们需要额外的权限,请授予他们。

这很简单。但是更新模板不会更新该模板所具有的先前现有用户的权限。