Der er en måde at implementere rollenedarvning ved at bruge rekursiv relation på tabel Roles
, ved at lave rollehenvisning til en anden post:
Denne relation tilføjer 1 : n
arv inden for Roles
optage. Du kan muligvis få hele hierarkitræet med denne gemte 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
Så kan du muligvis få alt bevilget tilladelser med noget som dette:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Hvis det ikke er nok, kan du lave en anden tabel for arv:
Men i dette tilfælde havde jeg brug for en anden hierarki-opnåelsesalgoritme.
For at løse tilsidesættelse problem, du bliver nødt til at få rolletilladelser og brugertilladelser. Skriv derefter user
tilladelser over roles
tilladelser til session
.
Jeg foreslår også at fjerne grant
kolonner i Permission_Role
og Permission_User
. Der er ingen grund til at kortlægge hver tilladelse til hver af dem. Lige nok til at bruge EXISTS
forespørgsler:hvis der er en post, er der givet tilladelse, ellers er det ikke. Hvis du har brug for at hente alle tilladelser og statusser, kan du bruge LEFT JOIN
s.