Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment concevoir un système de contrôle d'accès hiérarchique basé sur les rôles

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.