如何设计分级的基于角色的访问控制系统(How to design a hierarchical ro

2019-08-31 17:38发布

基本协议是,我们有我们的项目定制“Kickstart中”。 为此,我们正在寻找重做用户控制。 我知道有很多的问题,在那里大约一般的RBAC,但我无法找到任何关于分级RBAC的?

我们的要求是:

  • 角色可被分配给组权限
  • 如果角色没有权限条目,然后它会自动拒绝
  • 用户可以被给予首要权限
  • A的用户重写的权限可以是一个授予或拒绝
  • 如果用户明确拒绝权限不管说什么样的角色“授予”的覆盖胜。
  • 用户可以拥有多个角色
  • 角色可以有层次
  • 角色可以从其他角色继承(例如“论坛超级版主”的角色是一个“论坛版主”和“系统维护”,和“论坛版主”的角色,从“论坛的”角色已经继承)
  • 来自该拒绝或授予特权另一个角色继承角色重写他们的孩子权限
  • 权限由“模块”(例如“博客”模块可以有一个“编辑条目”权限和“论坛”模块可以有一个“编辑条目”的许可,他们将不会发生冲突)分组
  • 有自动授予完全访问一个“什么都”权限

因此,与闪开这些要求,这里就是我在想这样做的。

表:用户

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

好吧,其实这是它的一半,这部分我可以肯定,我被卡住的部分是分层的作用。

所以,我怎么设计呢? 我的想法是对数据库查询,我只是要建立在登录时允许矩阵并将其保存到会话保存这样的查询不必过于简单,因为他们只为每个登录运行一次。

我看到的问题是,我会在我解决继承需要知道角色的层次,所以我可以解决继承的角色的权限。

用户权限是比较容易的部分,每个用户的权限,在本质上是最终解决小组。

Answer 1:

有使用上表递推关系来实现角色继承的方式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

然后,你可能会得到像这样的东西全部授予的权限:

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

如果这还不够,那么你可能做继承另一个表:

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


要解决最重要的问题,你将获得角色权限和用户权限。 然后,写user在权限roles权限session


另外,我建议删除grantPermission_RolePermission_User 。 没有必要对每个权限映射为他们每个人。 只是足够使用EXISTS询问:是否有记录,那么授予的权限,否则-它不是。 如果您需要检索的所有权限和状态,你可以使用LEFT JOIN秒。



文章来源: How to design a hierarchical role based access control system