sql >> Database >  >> RDS >> Mysql

Hoe een hiërarchisch, op rollen gebaseerd toegangscontrolesysteem te ontwerpen?

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.




  1. Een tabelafhankelijkheidsgrafiek maken met een recursieve query

  2. Een regeleinde invoegen in een SQL Server VARCHAR/NVARCHAR-tekenreeks

  3. Hoe UTC_DATE() werkt in MariaDB

  4. MySQL-query String bevat: