En supposant la structure de base de données suivante (modifiable si nécessaire) ...
Je cherche un bon moyen de déterminer les "autorisations effectives" pour un utilisateur donné sur une page donnée d'une manière qui me permet de renvoyer une ligne contenant la page et les autorisations effectives.
Je pense que la solution idéale peut inclure une fonction qui utilise un CTE pour effectuer la récursivité nécessaire pour évaluer les "autorisations effectives" pour une ligne de page donnée pour l'utilisateur actuel.
Contexte et détails de mise en œuvre
Le schéma ci-dessus représente un point de départ pour un système de gestion de contenu dans lequel les utilisateurs peuvent se voir accorder des autorisations en étant ajoutés et supprimés des rôles.
Les ressources du système (par exemple, les pages) sont associées à des rôles pour accorder au groupe d'utilisateurs liés à ce rôle les autorisations qu'il accorde.
L'idée est de pouvoir verrouiller facilement un utilisateur simplement en refusant tout rôle et en ajoutant la page de niveau racine dans l'arborescence à ce rôle, puis en ajoutant l'utilisateur à ce rôle.
Cela permettrait à la structure d'autorisations de rester en place lorsque (par exemple) un entrepreneur travaillant pour l'entreprise n'est pas disponible pendant de longues périodes, cela permettra également la même octroi de leurs autorisations d'origine en supprimant simplement l'utilisateur de ce rôle. .
Les autorisations sont basées sur des règles de type ACL typiques qui peuvent s'appliquer au système de fichiers en suivant ces règles.
Les autorisations CRUD doivent être des bits annulables, de sorte que les valeurs disponibles sont vraies, fausses, non définies dans les cas suivants:
- faux + n'importe quoi = faux
- vrai + non défini = vrai
- vrai + vrai = vrai
- non défini + non défini = non défini
Si l'une des autorisations est fausse -> fausse Sinon, s'il y en a un vrai -> vrai Sinon (tous non définis) -> faux
En d'autres termes, vous n'obtenez aucune autorisation sur quoi que ce soit, sauf si vous leur êtes accordé via l'appartenance au rôle et qu'une règle de refus remplace une règle d'autorisation.
Le "jeu" d'autorisations auquel cela s'applique est toutes les autorisations appliquées à l'arborescence jusqu'à et y compris la page en cours, en d'autres termes: si un faux est dans n'importe quel rôle appliqué à n'importe quelle page de l'arborescence de cette page, alors le résultat est faux , mais si l’arbre entier jusqu’ici n’est pas défini, alors la page courante contient une vraie règle, le résultat est vrai ici mais serait faux pour le parent.
J'aimerais garder la structure de la base de données si possible, gardez également à l'esprit que mon objectif ici est de pouvoir faire quelque chose comme: select * from pages where effective permissions (read = true) and user = ?
ainsi, toute solution devrait pouvoir me permettre d'avoir un ensemble interrogeable avec les autorisations effectives dedans dans d'une certaine manière (leur retour est facultatif tant que les critères peuvent être spécifiés).
En supposant que 2 pages existent où 1 est un enfant de l'autre et 2 rôles existent, un pour les utilisateurs admin et 1 pour les utilisateurs en lecture seule, les deux sont liés uniquement à la page de niveau racine, je m'attendrais à voir quelque chose comme ceci en tant que sortie attendue:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
Une discussion plus approfondie autour de cette question peut être trouvée dans la salle de discussion du site principal commençant ici .