我正在尝试实现基于角色的访问控制(RBAC),但是一个用户可以拥有多个角色,并且每个角色都处于特定的上下文中。
上下文基于3个因素:公司、产品和地区。
因此,用户A可以是公司1的管理员,并且还可以是公司2 > 产品3 > 地区4的查看者。
针对这种RBAC设置,最佳方法是什么?
目前我正在手动编写代码 - 因此寻找最佳的数据库表结构方式,以允许这种粒度级别的访问。
不幸的是,这是一个使用PHP CodeIgniter / mySQL运行的遗留应用程序 - 因此任何现代的现有库可能不兼容。
更新:到目前为止,我已经创建了“权限”表,它映射到“角色”,然后将“角色”分配给用户,并赋予其上下文。
这个的 SQL 大致如下...
这样做是可行的,但我相信肯定有更好的方法。
接下来的问题是如何对角色应用层次结构?例如公司>产品>地区的“管理员”只能创建其角色或更低级别的用户?
我需要查找他们在当前上下文中分配的角色,然后返回每个比该用户角色低的角色。
这个上下文是否最好作为字符串放置?例如“1.3.gb” / “1.2”?然后在查找角色时,我首先形成上下文字符串?
上下文基于3个因素:公司、产品和地区。
因此,用户A可以是公司1的管理员,并且还可以是公司2 > 产品3 > 地区4的查看者。
针对这种RBAC设置,最佳方法是什么?
目前我正在手动编写代码 - 因此寻找最佳的数据库表结构方式,以允许这种粒度级别的访问。
不幸的是,这是一个使用PHP CodeIgniter / mySQL运行的遗留应用程序 - 因此任何现代的现有库可能不兼容。
更新:到目前为止,我已经创建了“权限”表,它映射到“角色”,然后将“角色”分配给用户,并赋予其上下文。
account_id | role_id | company_id | product_id | region_id |
------------------------------------------------------------
1 | 1 | | | |
2 | 2 | 1 | | |
2 | 3 | 2 | 1 | |
3 | 4 | 3 | 1 | 2 |
3 | 4 | 3 | 1 | 3 |
3 | 4 | 3 | 1 | 4 |
这个的 SQL 大致如下...
SELECT DISTINCT account_id
FROM user_roles ur, role_permissions rp
JOIN permissions p ON rp.permission_id=p.id
WHERE (
#correct user that has a role with the permission we want
ur.account_id = 1
AND rp.permission_id IN (1,2,3)
AND ur.role_id = rp.role_id
#if the user is sys admin they can see everything
AND (
ur.role_id = 1
#if the user is company admin
OR ( ur.role_id = 2 AND ur.company_id=@cid )
#if the user is product admin
OR ( ur.role_id = 3 AND ur.company_id=@cid AND ur.product_id=@pid )
#if the user is any other role then the need explicit access
OR ( ur.role_id > 3 AND ur.company_id=@cid AND ur.product_id=@pid AND ur.country_code=@cc )
)
);
这样做是可行的,但我相信肯定有更好的方法。
接下来的问题是如何对角色应用层次结构?例如公司>产品>地区的“管理员”只能创建其角色或更低级别的用户?
我需要查找他们在当前上下文中分配的角色,然后返回每个比该用户角色低的角色。
这个上下文是否最好作为字符串放置?例如“1.3.gb” / “1.2”?然后在查找角色时,我首先形成上下文字符串?