在 Laravel 应用程序中,我有 users
, roles
和permissions
。角色附属于用户,权限附属于角色。
用户:
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
在此示例中user
与 id
1,是 Admin
他可以add_admin
, delete_admin
, approve_order
但我需要不同的管理员拥有不同的权限。在这个结构中,如果我附加 admin
角色为user
与 id
2,他的权限与 user
相同与 id
1 有。
我需要不同的管理员拥有不同的权限,不同的客户端拥有不同的权限。
有一个小场景:
假设有两个用户A和B,他们想注册为客户端,所以当他们注册时我会将客户端角色附加给他们。他们具有相同的权限,但如果用户A要上传他的文档,我需要将新权限附加给用户A,而不是用户B。
我的解决方案是创建一个新表,在其中向用户附加权限
用户权限:
Id | user_id | permission_id
____________________________
1 | 1 | 4
因此用户的所有权限将是他的角色的权限+上面我描述的表中的权限
我需要决定这个解决方案是好是坏,或者是否有其他更好的方法。对于此类问题有最佳实践吗?
最佳答案
您可以考虑使用累积多角色方案
允许每个用户拥有一个有序的角色列表。
为每个需要一组特殊权限的用户创建自定义角色。
允许角色授予和撤回权限。
假设 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/