Attachez vos ceintures, c'est une question délicate.
Nous avons un système qui gère de gros ensembles de données. (des millions à des milliards d'enregistrements par table). Toutes les données sont gérées dans une structure arborescente de nœuds.
Nous utilisons Symfony2, et le système de sécurité Symfony2 (Objets de domaine, Acls, Aces, etc). Notre arborescence Acl reflète notre arborescence de nœuds.
Pour inventer un langage :
DP
Permission définie, c'est-à-dire un enregistrement ace sur ce nœud aclEP
Permission effective, aucun enregistrement ace, permission héritée d'un parent avec unDP
En termes de logique métier, nous attribuons 0 ou 1 ace à un objet par utilisateur et nous nous appuyons sur l'héritage lorsqu'il n'existe pas. Root > lvl1 (DP: VIEW) > lvl2 > lvl3 (EP: VIEW)
Jusque-là, tout va bien. Tout cela fonctionne.
Certains nœuds non seulement ont un parent, mais sont associés à d'autres nœuds (plusieurs à plusieurs). Lorsqu'un nœud est associé à un autre nœud, cela représente un chemin séparé à suivre pour les acls. Par exemple, nous aurions 1 ou plusieurs chemins jusqu'à la racine pour rassembler les ace.
Leaf < Parent < GrandParent < Root
Leaf < AssociatedNode < AssociatedNodeParent < AssociatedNodeGrandParent < Root
...
L'ajout d'une logique pour gérer le vote des aces est bien, mais ce dont nous ne sommes pas sûrs, c'est comment représenter les multiples chemins jusqu'à la racine. Nos idées actuelles (lire : mauvaises) sont les suivantes :
- Comportement de plusieurs parents dans l'arborescence acl
- Avantages
- Semble plus propre ?
- Inconvénients
- Presque une réécriture complète du système de sécurité pour le mettre en place.
- Potentiel de devenir très complexe.
- Avantages
- Identités d'objets / acls dupliqués contre des entités, en spécifiant différents parents.
- Avantages
- Euh...
- Inconvénients
- Créera potentiellement un très grand nombre d'enregistrements acl.
- Difficile à gérer dans le code.
- Avantages