Es gibt eine Möglichkeit, die Rollenvererbung zu implementieren, indem eine rekursive Beziehung in der Tabelle Roles
verwendet wird , indem Sie auf einen anderen Datensatz verweisen:
Diese Relation fügt 1 : n
hinzu Vererbung innerhalb von Roles
Aufzeichnung. Sie können den gesamten Hierarchiebaum mit dieser gespeicherten Funktion erhalten:
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
Dann erhalten Sie möglicherweise alle erteilt Berechtigungen etwa so:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Wenn es nicht genug ist, dann könnten Sie eine andere Tabelle für die Vererbung erstellen:
In diesem Fall war jedoch ein weiterer Algorithmus zum Abrufen der Hierarchie erforderlich.
Um Überschreiben zu beheben Problem müssen Sie Rollenberechtigungen und Benutzerberechtigungen erhalten. Schreiben Sie dann user
Berechtigungen über Roles
Berechtigungen für session
.
Außerdem schlage ich vor, grant
zu entfernen Spalten in Permission_Role
und Permission_User
. Eine Zuordnung ist nicht erforderlich jede Erlaubnis für jeden von ihnen. Gerade genug, um EXISTS
zu verwenden Abfragen:Wenn es einen Datensatz gibt, dann wird die Erlaubnis erteilt, sonst - ist es nicht. Wenn Sie alle Berechtigungen und Status abrufen müssen, können Sie LEFT JOIN
verwenden s.