gpt4 book ai didi

php - 具有上下文的基于角色的访问控制(RBAC)?

转载 作者:可可西里 更新时间:2023-11-01 09:02:18 24 4
gpt4 key购买 nike

我正在尝试实现 RBAC,但用户可以拥有多个角色,每个角色都在特定的上下文下。

上下文基于 3 个因素,CompanyProductRegion

所以用户 A 可以是公司 1 的 Admin,也可以是公司 2 > Product 3 > Region 4 的 Viewer

这种 RBAC 设置的最佳方法是什么?

我目前正在手动滚动这个 - 所以正在寻找构建允许这种级别的精细访问的数据库表的最佳方法。

不幸的是,这是在运行 PHP CodeIgniter/mySQL 的遗留应用程序上 - 因此任何现代现有库可能不兼容。

更新

到目前为止,我有这个。 Permissions 表映射到 Roles,然后将 Roles 分配给用户,并给出上下文。

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”?然后在查找角色时,我先形成上下文字符串?

最佳答案

用户表可以与 roll 表交叉引用,每个 roll 都有一个特定的角色标识号,带有 can_writecan_read 列(等...)

您的继承人可能看起来像这样:

Users:
uid(int) auto_increment primary
role_id(int)

Roles:
rid(int) auto_increment primary
description(varchar)
// any access values ie: can_read(int)

然后您可以设置一个允许查看区域的子角色表。

访问这些表的一些示例代码:

$stmp = (new PDO(...))->Prepare("SELECT role_id FROM Users WHERE uid = :userid");
$stmp->bindValue(":userid", $id); // I'd suggest storing a login key using sessions
$stmp->execute();
$user_permissions = $stmp->Fetch()['role_id'];

// Reference the Roles table for permission lists
$stmp = (new PDO(...))->Prepare("SELECT * FROM Roles WHERE rid = :roleid");
$stmp->bindValue(":roleid", $user_permissions);
[...]

希望这对您有所帮助。

关于php - 具有上下文的基于角色的访问控制(RBAC)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com