Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zaprojektować hierarchiczny system kontroli dostępu oparty na rolach?

Istnieje sposób na zaimplementowanie dziedziczenia ról przy użyciu relacji rekurencyjnej w tabeli Roles , odwołując się do roli do innego rekordu:

Ta relacja doda 1 : n dziedziczenie w ramach Roles nagrywać. Za pomocą tej zapisanej funkcji możesz uzyskać całe drzewo hierarchii:

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

Wtedy możesz otrzymać wszystkie przyznane uprawnienia z czymś takim:

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

Jeśli to nie wystarczy, możesz zrobić inną tabelę dziedziczenia:

Ale w tym przypadku potrzebny był inny algorytm uzyskiwania hierarchii.

Aby rozwiązać zastępowanie problem będziesz musiał uzyskać uprawnienia roli i uprawnienia użytkownika. Następnie wpisz user uprawnienia ponad roles uprawnienia do session .

Proponuję również usunąć grant kolumny w Permission_Role i Permission_User . Nie ma potrzeby mapowania każde pozwolenie dla każdego z nich. Wystarczy użyć EXISTS zapytania:jeśli istnieje rekord, to przyznano pozwolenie, w przeciwnym razie - nie. Jeśli chcesz odzyskać wszystkie uprawnienia i statusy, możesz użyć LEFT JOIN s.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernacja mapowania relacji/przyspieszenie wstawiania partii

  2. Dlaczego liczność indeksu w MySQL pozostaje niezmieniona po dodaniu nowego indeksu?

  3. INSERT ... ON DUPLICATE KEY AKTUALIZACJA z GDZIE?

  4. Zbyt wiele automatycznych przyrostów przy ON DUPLICATE KEY UPDATE

  5. Czytaj tablicę JSON w MYSQL