Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да проектираме йерархична ролева система за контрол на достъпа

Има начин за реализиране на наследяване на роли чрез използване на рекурсивна релация в таблица 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 .

Също така предлагам да премахнете grant колони в Permission_Role и Permission_User . Няма нужда откартографиране всяко разрешение за всеки от тях. Достатъчно, за да използвате EXISTS запитвания:ако има запис, тогава разрешението е дадено, иначе - не е. Ако трябва да извлечете всички разрешения и състояния, можете да използвате LEFT JOIN с.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL EXPLAIN 'type' се променя от 'range' на 'ref', когато датата в оператора where се промени?

  2. Можете ли да решите тази проста SQL заявка?

  3. Как да промените часовата зона на MySQL Server?

  4. Как изброявате всички тригери в MySQL база данни?

  5. добра практика ли е да използвате mysql_free_result($result)?