sql >> Database teknologi >  >> RDS >> Mysql

Hvordan man designer et hierarkisk rollebaseret adgangskontrolsystem

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.




  1. Hvordan laver man et felt NULL ved hjælp af MySQL GUI Tools?

  2. ORA-00604 ORA-12705

  3. Har problemer med UnixODBC, FreeTDS og PyODBC

  4. Strengdata, højre trunkeret:1406 Data for lange til kolonne