Hai*_*ood 36 php mysql permissions hierarchy rbac
基本的交易是,我们为我们的项目定制了"kickstart".为此我们正在考虑重做用户控件.我知道有很多关于一般rbac的问题,但我在层次结构rbac上找不到任何问题?
我们的要求是:
所以,有了这些要求,这就是我在考虑这样做的方式.
id | int | unique id
Run Code Online (Sandbox Code Playgroud)
id | int | unique id
--------------|---------------------------------------------
title | varchar | human readable name
Run Code Online (Sandbox Code Playgroud)
id | int | unique id
--------------|---------------------------------------------
module | varchar | module name
--------------|---------------------------------------------
title | varchar | human readable name
--------------|---------------------------------------------
key | varchar | key name used in functions
Run Code Online (Sandbox Code Playgroud)
role_id | int | id from roles table
--------------|---------------------------------------------
user_id | int | id from users table
Run Code Online (Sandbox Code Playgroud)
id | int | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
role_id | int | id from roles table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
Run Code Online (Sandbox Code Playgroud)
id | int | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
user_id | int | id from users table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
Run Code Online (Sandbox Code Playgroud)
嗯,实际上这是它的一半,我确信这一部分,我要坚持的部分是层级角色.
那么,我该如何设计呢?我的想法是,为了节省数据库查询,我将在登录时构建权限矩阵并将其保存到会话中,因此查询不必太简单,因为它们仅针对每次登录运行一次.
我看到的问题是,我将需要知道角色的层次结构,以便在解析继承之前解析继承的角色权限.
用户权限是简单的部分,每用户权限基本上是最终解析的组.
Bli*_*itZ 50
有一种方法可以通过在表上使用递归关系来实现角色继承,方法Roles是将角色引用到另一条记录:

此关系将1 : n在Roles记录中添加继承.您可以使用此存储函数获取整个层次结构树:
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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下内容获取所有已授予的权限:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Run Code Online (Sandbox Code Playgroud)
如果还不够,那么你可以做另一个继承表:

但是,在这种情况下,需要另一种层次结构获取算法.
要解决覆盖 问题,您必须获得角色权限和用户权限.然后,写user了权限roles的权限session.
另外,我建议删除和中的grant列.无需为每个权限映射每个权限.足以使用查询:如果有记录,则授予权限,否则 - 不是.如果您需要检索所有权限和状态,则可以使用s.Permission_RolePermission_UserEXISTSLEFT JOIN
| 归档时间: |
|
| 查看次数: |
28378 次 |
| 最近记录: |