gpt4 book ai didi

php - 如何设计基于分层角色的访问控制系统

转载 作者:IT老高 更新时间:2023-10-28 13:00:29 24 4
gpt4 key购买 nike

基本交易是,我们为我们的项目定制了一个“kickstart”。为此,我们正在考虑重做用户控件。我知道有很多关于一般 rbac 的问题,但我在分层 rbac 上找不到任何问题?

我们的要求是:

  • 可以将角色分配给组权限
  • 如果角色没有权限条目,则会自动拒绝
  • 可以为用户授予覆盖权限
  • 覆盖权限的用户要么是授权,要么是拒绝
  • 如果用户被明确拒绝权限,无论什么角色说“授予”了覆盖,都会获胜。
  • 用户可以拥有多个角色
  • 角色可以有层次结构
  • 角色可以继承自其他角色(例如,“论坛 super 版主”角色是“论坛版主”和“系统维护者”,而“论坛版主”角色已经继承自“论坛用户”角色)
  • 从拒绝或授予权限的其他角色继承的角色会覆盖其子权限
  • 权限按“模块”分组(例如,“博客”模块可以有“编辑条目”权限,“论坛”模块可以有“编辑条目”权限,它们不会冲突)
  • 有一个“Everything and Anything”权限自动授予完全访问权限

所以,这些要求已经排除,这就是我的想法。

表:用户

id            | int     | unique id

表:角色

id            | int     | unique id
--------------|---------------------------------------------
title | varchar | human readable name

表:权限

id            | int     | unique id
--------------|---------------------------------------------
module | varchar | module name
--------------|---------------------------------------------
title | varchar | human readable name
--------------|---------------------------------------------
key | varchar | key name used in functions

表:Role_User

role_id       | int     | id from roles table
--------------|---------------------------------------------
user_id | int | id from users table

表:Permission_Role

id            | int     | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
role_id | int | id from roles table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant

表:Permission_User

id            | int     | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
user_id | int | id from users table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant

嗯,实际上这是一半,我确定的那部分,我卡住的部分是等级角色。

那么,我该如何设计呢?我的想法是,为了保存数据库查询,我将在登录时构建权限矩阵并将其保存到 session 中,这样查询就不必太简单,因为它们每次登录只运行一次。

我看到的问题是,我需要知道角色的层次结构,以便在解决继承问题之前解决继承的角色权限。

用户权限是最简单的部分,每个用户的权限本质上是最终解决的组。

最佳答案

有一种方法可以通过使用表Roles上的递归关系来实现角色继承,方法是让角色引用另一条记录:

1:n inheritance

此关系将在 Roles 记录中添加 1 : n 继承。您可以使用此存储函数获得整个层次结构树:

CREATE FUNCTION `getHierarchy`(`aRole` BIGINT UNSIGNED)
RETURNS VARCHAR(1024)
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE `aResult` VARCHAR(1024) DEFAULT NULL;
DECLARE `aParent` BIGINT UNSIGNED;

SET `aParent` = (SELECT `parent` FROM `Roles` WHERE `id` = `aRole`);

WHILE NOT `aParent` IS NULL DO

SET `aResult` = CONCAT_WS(',', `aResult`, `aParent`);
SET `aParent` = (SELECT `parent` FROM `Roles` WHERE `id` = `aParent`);

END WHILE;

RETURN IFNULL(`aResult`, '');
END

然后,您可能会通过以下方式获得所有授予权限:

SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;

如果还不够的话,可以再做一张表继承:

n:m inheritance

但是,在这种情况下,需要另一个层次获得算法。


要解决覆盖问题,您必须获得角色权限和用户权限。然后,将 user 权限写入 roles 权限到 session


另外,我建议删除 Permission_RolePermission_User 中的 grant 列。无需为每个权限映射每个权限。足以使用 EXISTS 查询:如果有记录,则授予权限,否则 - 不是。如果您需要检索所有权限和状态,您可以使用 LEFT JOINs。

关于php - 如何设计基于分层角色的访问控制系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16139712/

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