Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como projetar um sistema de controle de acesso baseado em funções hierárquicas


Existe uma maneira de implementar a herança de papéis usando a relação recursiva na tabela Roles , fazendo referência de função a outro registro:



Esta relação adicionará 1 : n herança dentro de Roles registro. Você pode obter toda a árvore de hierarquia com esta função armazenada:
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

Então, você pode obter todos os concedidos permissões com algo assim:
SELECT
    `permission_id`
FROM
    `Permission_Role`
WHERE
    FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
    AND
    grant;

Se não for suficiente, você pode fazer outra tabela para herança:



Mas, neste caso, precisava de outro algoritmo de obtenção de hierarquia.

Para resolver a substituição problema, você terá que obter permissões de função e permissões de usuário. Em seguida, escreva user permissões sobre roles permissões para session .

Além disso, sugiro remover grant colunas em Permission_Role e Permission_User . Não há necessidade de mapear cada permissão para cada um deles. Apenas o suficiente para usar EXISTS consultas:se houver um registro, a permissão será concedida, senão - não é. Se você precisar recuperar todas as permissões e status, poderá usar LEFT JOIN s.