Istnieje sposób na zaimplementowanie dziedziczenia ról przy użyciu relacji rekurencyjnej w tabeli Roles
, odwołując się do roli do innego rekordu:
Ta relacja doda 1 : n
dziedziczenie w ramach Roles
nagrywać. Za pomocą tej zapisanej funkcji możesz uzyskać całe drzewo hierarchii:
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
Wtedy możesz otrzymać wszystkie przyznane uprawnienia z czymś takim:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Jeśli to nie wystarczy, możesz zrobić inną tabelę dziedziczenia:
Ale w tym przypadku potrzebny był inny algorytm uzyskiwania hierarchii.
Aby rozwiązać zastępowanie problem będziesz musiał uzyskać uprawnienia roli i uprawnienia użytkownika. Następnie wpisz user
uprawnienia ponad roles
uprawnienia do session
.
Proponuję również usunąć grant
kolumny w Permission_Role
i Permission_User
. Nie ma potrzeby mapowania każde pozwolenie dla każdego z nich. Wystarczy użyć EXISTS
zapytania:jeśli istnieje rekord, to przyznano pozwolenie, w przeciwnym razie - nie. Jeśli chcesz odzyskać wszystkie uprawnienia i statusy, możesz użyć LEFT JOIN
s.