sql >> Databasteknik >  >> RDS >> Mysql

Hur man designar ett hierarkiskt rollbaserat passersystem

Det finns ett sätt att implementera rollarv genom att använda rekursiv relation i tabellen Roles , genom att göra rollreferens till en annan post:

Denna relation kommer att lägga till 1 : n arv inom Roles spela in. Du kan få hela hierarkiträdet med denna lagrade 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

Då kan du få alla beviljade behörigheter med något sånt här:

SELECT
    `permission_id`
FROM
    `Permission_Role`
WHERE
    FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
    AND
    grant;

Om det inte räcker kan du göra en annan tabell för arv:

Men i det här fallet behövde en annan hierarki-erhållandealgoritm.

För att lösa åsidosättning problem du måste få rollbehörigheter och användarbehörigheter. Skriv sedan user behörigheter över roles behörigheter till session .

Jag föreslår också att du tar bort grant kolumner i Permission_Role och Permission_User . Det finns ingen anledning att karta varje tillstånd för var och en av dem. Precis tillräckligt för att använda EXISTS frågor:om det finns en post, beviljas tillstånd, annars - det är det inte. Om du behöver hämta alla behörigheter och statusar kan du använda LEFT JOIN s.




  1. SQLite - Skapa en databas

  2. Django oracle db-inställningar

  3. Vilken datatyp ska användas för hashat lösenordsfält och vilken längd?

  4. Är det möjligt att ändra den naturliga ordningen på kolumner i Postgres?