当前位置: 首页 > 知识库问答 >
问题:

如何设计基于层次角色的权限改造系统

慕容俭
2023-03-14

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

我们的要求是:

  • 角色可以分配给组权限
  • 如果角色没有权限条目,则自动拒绝
  • 用户可以被赋予覆盖权限
  • 用户覆盖权限是授予或拒绝
  • 如果用户被显式拒绝权限,无论哪个角色都说已授予,则重写获胜。
  • 用户可以有多个角色
  • 角色可以有层次
  • 角色可以从其他角色继承(例如:论坛超级主持人角色是论坛主持人和系统维护者,论坛主持人角色已经继承了论坛用户角色)
  • 从拒绝或授予特权的另一个角色继承的角色将重写其子权限
  • 权限按模块分组(例如,博客模块可以有编辑条目权限,论坛模块可以有编辑条目权限,它们不会冲突)
  • 有一个“一切和任何”权限,自动授予完全访问权限

所以,在这些要求被排除在外的情况下,下面是我的想法。

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_id       | int     | id from roles table
--------------|---------------------------------------------
user_id       | int     | id from users table
id            | int     | unique id
--------------|---------------------------------------------
permission_id | int     | id from permissions table
--------------|---------------------------------------------
role_id       | int     | id from roles table
--------------|---------------------------------------------
grant         | tinyint | 0 = deny, 1 = grant
id            | int     | unique id
--------------|---------------------------------------------
permission_id | int     | id from permissions table
--------------|---------------------------------------------
user_id       | int     | id from users table
--------------|---------------------------------------------
grant         | tinyint | 0 = deny, 1 = grant

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

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

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

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

共有1个答案

羊舌承颜
2023-03-14

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

此关系将在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;

如果这还不够,您可以使用另一个表进行继承:

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

要解决重写问题,您必须获得角色权限和用户权限。然后,将用户权限写入角色权限到会话

此外,我建议删除Permission\u RolePermission\u User中的grant列。不需要映射每个用户的每个权限。只需使用存在查询即可:如果有记录,则授予权限,否则不授予权限。如果需要检索所有权限和状态,可以使用LEFT JOINs。

 类似资料:
  • SpringSecurity配置 用户模型 榜样 CustomUserDetailsService 有一些等类也有,但我不是张贴由于大段,如果任何人需要具体的,我会张贴。 当我尝试运行时,控制台出现以下错误: 请朋友们帮帮我。

  • 问题内容: 我需要在使用PHP / MySQL构建的Web应用程序中添加用户角色和权限系统。我想要此功能: 一个root用户可以创建子root,组,规则和普通用户(所有特权)。 子根只能为其自己的组(无组)创建规则,权限和用户。 用户可以基于组根分配给他或他的组的权限来访问分配给他或他的组的内容。 我需要系统足够灵活,以便将新角色和权限分配给内容。 我有一个表,用于存储组密钥以及其他信息。目前,我

  • 情景: 我们有一个多租户应用程序,其中每个租户都有自己的模式。有一个公共模式,其中存在一个包含每个租户记录的表。因此,有一个超级管理员可以创建租户,并将管理员分配给新创建的租户。 为了实现RBAC(基于角色的访问控制),我计划将每个角色表放入租户模式,并实现一些中间件来检查授权。在孤立的模式环境中,这是一个好的体系结构吗?

  • 读后http://en.wikipedia.org/wiki/Role-based_access_control看到人们建立授权/访问控制的方式,我想到了这个问题:“为什么我们在检查用户是否被允许执行X操作时检查用户的角色,而不是检查他们的权限?” 这就是我所理解的,用户有角色,角色有权限,这就是用户可以拥有权限的方式(用户不能明确地拥有分配给它的权限,它通过拥有角色获得权限) 我认为,在处理添加

  • 我正在为访问控制系统设计一个数据库模型,该系统部分基于角色,但需要一些访问列表功能和关系访问。 我正在为一所学校构建一个web应用程序(如果需要的话,可以使用PHP和MVC体系结构),用于管理学生、教师、员工和管理者之间的互动,例如教师奖励学生,或者其中一名员工招收或开除学生。我的主要问题是,我被要求:1-为每个用户提供可选的额外权限,而不是他们已经从角色继承的权限。(= 走这条路对吗?我应该为每

  • security.yml: 当我登录,我得到403禁止例外。然后我检查分析器/安全性,角色看起来像这样: 当我将访问控制切换到: 它工作正常。 我的目标是删除内置角色(如ROLE_USER,ROLE_ADMIN等),因为我正在为现有数据库编写应用程序,其中包含用户已经定义的角色,所以我想使用它们。