Existuje způsob, jak implementovat dědičnost rolí pomocí rekurzivního vztahu v tabulce Roles
, odkazem na roli na jiný záznam:
Tento vztah přidá 1 : n
dědičnost v rámci Roles
záznam. Pomocí této uložené funkce můžete získat celý strom hierarchie:
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
Pak můžete získat všechny udělené oprávnění s něčím takovým:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Pokud to nestačí, můžete vytvořit další tabulku pro dědění:
Ale v tomto případě je potřeba jiný algoritmus pro získání hierarchie.
Chcete-li vyřešit přepsání problém, budete muset získat oprávnění role a uživatelská oprávnění. Poté napište user
oprávnění k roles
oprávnění k session
.
Navrhuji také odstranit grant
sloupců v Permission_Role
a Permission_User
. Není potřeba mapovat každé povolení pro každého z nich. Stačí použít EXISTS
dotazy:pokud existuje záznam, pak povolení uděleno, jinak - není. Pokud potřebujete získat všechna oprávnění a stavy, můžete použít LEFT JOIN
s.