Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie man ein hierarchisches rollenbasiertes Zugriffskontrollsystem entwirft

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.