Det finns ett sätt att implementera rollarv genom att använda rekursiv relation i tabellen Roles
, genom att göra rollreferens till en annan post:
Denna relation kommer att lägga till 1 : n
arv inom Roles
spela in. Du kan få hela hierarkiträdet med denna lagrade funktion:
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
Då kan du få alla beviljade behörigheter med något sånt här:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Om det inte räcker kan du göra en annan tabell för arv:
Men i det här fallet behövde en annan hierarki-erhållandealgoritm.
För att lösa åsidosättning problem du måste få rollbehörigheter och användarbehörigheter. Skriv sedan user
behörigheter över roles
behörigheter till session
.
Jag föreslår också att du tar bort grant
kolumner i Permission_Role
och Permission_User
. Det finns ingen anledning att karta varje tillstånd för var och en av dem. Precis tillräckligt för att använda EXISTS
frågor:om det finns en post, beviljas tillstånd, annars - det är det inte. Om du behöver hämta alla behörigheter och statusar kan du använda LEFT JOIN
s.