Er is een manier om rolovererving te implementeren door een recursieve relatie te gebruiken in tabel Roles
, door een rolverwijzing te maken naar een ander record:
Deze relatie voegt 1 : n
. toe overerving binnen Roles
Vermelding. U kunt een hele hiërarchiestructuur verkrijgen met deze opgeslagen functie:
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
Dan krijgt u misschien alle toegekende permissies met zoiets als dit:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Als het niet genoeg is, kun je een andere tabel voor overerving doen:
Maar in dit geval was een ander algoritme voor het verkrijgen van hiërarchie nodig.
Om overschrijven op te lossen probleem moet u rolmachtigingen en gebruikersmachtigingen krijgen. Schrijf vervolgens user
machtigingen over roles
machtigingen voor session
.
Ik stel ook voor om grant
te verwijderen kolommen in Permission_Role
en Permission_User
. Het is niet nodig om in kaart te brengen elke toestemming voor elk van hen. Net genoeg om EXISTS
te gebruiken query's:als er een record is, wordt toestemming verleend, anders niet. Als u alle machtigingen en statussen moet ophalen, kunt u LEFT JOIN
gebruiken v.