sql >> Databáze >  >> RDS >> Mysql

Jak navrhnout hierarchický systém řízení přístupu založený na rolích

Existuje způsob, jak implementovat dědičnost rolí pomocí rekurzivního vztahu v tabulce Roles , odkazem na roli na jiný záznam:

Tento vztah přidá 1 : n dědičnost v rámci Roles záznam. Pomocí této uložené funkce můžete získat celý strom hierarchie:

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

Pak můžete získat všechny udělené oprávnění s něčím takovým:

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

Pokud to nestačí, můžete vytvořit další tabulku pro dědění:

Ale v tomto případě je potřeba jiný algoritmus pro získání hierarchie.

Chcete-li vyřešit přepsání problém, budete muset získat oprávnění role a uživatelská oprávnění. Poté napište user oprávnění k roles oprávnění k session .

Navrhuji také odstranit grant sloupců v Permission_Role a Permission_User . Není potřeba mapovat každé povolení pro každého z nich. Stačí použít EXISTS dotazy:pokud existuje záznam, pak povolení uděleno, jinak - není. Pokud potřebujete získat všechna oprávnění a stavy, můžete použít LEFT JOIN s.




  1. Nulové zablokování SQL podle návrhu – nějaké vzory kódování?

  2. Limity SQL NVARCHAR a VARCHAR

  3. MariaDB JSON_OBJECT() Vysvětleno

  4. Chyba MySQL 1093 - Nelze určit cílovou tabulku pro aktualizaci v klauzuli FROM