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