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.