programing

계층적 역할 기반 접근 제어 시스템 설계 방법

mailnote 2023. 10. 23. 22:00
반응형

계층적 역할 기반 접근 제어 시스템 설계 방법

기본적인 거래는 프로젝트를 위한 맞춤형 "킥스타트"가 있다는 것입니다.이를 위해 사용자 제어를 다시 수행하는 것을 고려하고 있습니다.일반적인 rbac에 대한 질문이 많은 것을 알고 있지만 계층적 rbac에 대해서는 찾을 수 없습니까?

요구 사항은 다음과 같습니다.

  • 역할을 그룹 권한에 할당할 수 있음
  • 역할에 권한 항목이 없으면 역할이 자동으로 거부됩니다.
  • 사용자에게 재지정 권한을 부여할 수 있음
  • 사용자가 권한을 재정의하는 것은 허용 또는 거부입니다.
  • 사용자가 "허용된" 역할에 상관없이 사용 권한을 명시적으로 거부할 경우 재정의가 성공합니다.
  • 사용자는 여러 역할을 가질 수 있음
  • 역할이 계층 구조를 가질 수 있음
  • 역할은 다른 역할(예: "Form Super Moderator" 역할은 "Form Moderator" 및 "System Maintener"이며 "Form Moderator" 역할은 "Form User" 역할에서 이미 상속됨)
  • 권한을 거부하거나 부여하는 다른 역할에서 상속하는 역할은 하위 권한을 재정의합니다.
  • 권한은 "module"(예: "Blog" 모듈은 "Edit Entry" 권한을, "Forum" 모듈은 "Edit Entry" 권한을 가질 수 있으며 충돌하지 않음)별로 그룹화됩니다.
  • 모든 권한을 자동으로 부여하는 "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_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

음, 사실 그게 절반이고, 제가 확신하는 부분은 계층적인 역할들입니다.

그럼 이걸 어떻게 디자인하죠?데이터베이스 쿼리를 저장하기 위해 로그인 시 권한 매트릭스를 구축하여 세션에 저장하면 각 로그인마다 한 번만 실행되므로 쿼리가 너무 단순할 필요가 없습니다.

문제는 상속을 해결하기 전에 상속된 역할 권한을 해결할 수 있도록 역할의 계층을 알아야 한다는 것입니다.

사용자 권한은 쉬운 부분이고, 사용자별 권한은 기본적으로 최종적으로 해결된 그룹입니다.

테이블에 재귀적 관계를 사용하여 역할 상속을 구현하는 방법이 있습니다.Roles, 다른 기록에 대한 역할 참조:

1:n inheritance

이 관계가 추가됩니다.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;

부족한 경우 상속에 대해 다른 테이블을 수행할 수 있습니다.

n:m inheritance

그러나 이 경우 다른 계층 획득 알고리즘이 필요했습니다.


우선 문제를 해결하려면 역할 권한과 사용자 권한을 받아야 합니다.그리고 쓰다user에 대한 허가.roles에 대한 허가.session.


또한, 제거할 것을 제안합니다.grant열 안에 있는Permission_Role그리고.Permission_User. 각각의 권한을 모두 매핑할 필요는 없습니다.사용하기에 충분합니다.EXISTS쿼리: 레코드가 있으면 권한이 부여되고 그렇지 않으면 그렇지 않습니다.모든 권한 및 상태를 검색해야 하는 경우 다음을 사용할 수 있습니다.LEFT JOINs.

언급URL : https://stackoverflow.com/questions/16139712/how-to-design-a-hierarchical-role-based-access-control-system

반응형