Il existe un moyen d'implémenter l'héritage des rôles en utilisant une relation récursive sur la table Roles
, en faisant référence au rôle vers un autre enregistrement :
Cette relation ajoutera 1 : n
héritage dans Roles
record. Vous pouvez obtenir une arborescence hiérarchique complète avec cette fonction stockée :
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
Ensuite, vous pourriez obtenir tous les accordés autorisations avec quelque chose comme ceci :
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Si cela ne suffit pas, vous pouvez créer une autre table pour l'héritage :
Mais, dans ce cas, il fallait un autre algorithme d'obtention de hiérarchie.
Pour résoudre le remplacement problème, vous devrez obtenir des autorisations de rôle et des autorisations d'utilisateur. Ensuite, écrivez user
autorisations sur les roles
autorisations de session
.
Aussi, je suggère de supprimer grant
colonnes dans Permission_Role
et Permission_User
. Il n'est pas nécessaire de mapper toutes les autorisations pour chacun d'eux. Juste assez pour utiliser EXISTS
requêtes :s'il y a un enregistrement, alors l'autorisation est accordée, sinon - ce n'est pas le cas. Si vous avez besoin de récupérer toutes les autorisations et tous les statuts, vous pouvez utiliser LEFT JOIN
s.