2017-08-11 1 views
1

J'essaie de réimplémenter un système ACL pour une application Web en utilisant Neo4j.Correspondant à l'un des chemins d'accès multiples (ACL)

L'application a une organisation hiérarchique dont les nœuds feuille peuvent posséder des tâches.

Il existe des rôles dotés d'autorisations. Les utilisateurs peuvent être affectés à un rôle dans une organisation ou une tâche. Cela devrait leur donner les permissions assignées au rôle au sein de cette organisation, les descendants et les tâches qui leur appartiennent.

En outre, certains utilisateurs se voient attribuer des autorisations uniques sur des organisations qui ne font pas partie d'un rôle.

J'ai paramétré le graphique en utilisant les arêtes hyper pour modéliser les intersections Utilisateur x Rôle x Organisation et Utilisateur x Autorisation x Organisation.

Current data model

Je suis en train de demander: « Est-ce que l'utilisateur dispose d'une autorisation donnée sur une tâche ou une organisation donnée (que ce soit par un rôle ou autorisation attribué directement à un noeud)? »

J'ai répondu en partie à l'aide:

MATCH (user:User)-[:MEMBER_OF]->(hyperedge:UserGroupRestriction) 
     WHERE user.userId = 1 
MATCH (hyperedge)-[:ON]->(restriction)-[:OWNS|:PARENT_OF*0..3]->(t:Task { id:2 }), 
(hyperedge)-[:ROLE]->(role:Role)-[:CAN]->(p:Permission { name: 'tasks.edit' }) 
RETURN count(restriction) > 0 AS `allowed` 

Cependant, cela ne fonctionne que pour la restriction de rôle, parce que je suis à la recherche qu'à la relation MEMBER_OF, qui relie un utilisateur à un bord hyper restriction du groupe. Comment puis-je modifier la requête afin que j'obtienne un vrai résultat si elle a l'autorisation, soit par le biais d'une appartenance à un rôle ou d'une permission attribuée? Le noeud Libellé pour les autorisations d'autorisation uniques est :UserPermissionRestriction. Merci pour toute idée, je suis ouvert à la restructuration du graphique si cela est logique, car ce n'est que la première preuve de concept.

+0

Peut-être que vous pouvez modifier votre question et mettre ici une requête Cypher pour créer un ensemble de données initial et le résultat attendu ... Merci. –

Répondre

0

Je ne sais pas si je comprends bien votre problème tout à fait, mais je crois que la question ci-dessous devrait fonctionner:

MATCH (user:User {userId : 1}) 
OPTIONAL MATCH (user)-[:CAN]->(oneOffPermission:UserPermissionRestriction) 
OPTIONAL MATCH (user)-[:MEMBER_OF]->(hyperedge:UserGroupRestriction) 
OPTIONAL MATCH (hyperedge)-[:ON]->(restriction)-[:OWNS|:PARENT_OF*0..3]->(t:Task { id:2 }), 
(hyperedge)-[:ROLE]->(role:Role)-[:CAN]->(p:Permission { name: 'tasks.edit' }) 
RETURN (count(oneOffPermission) > 0 OR count(restriction) > 0) AS `allowed` 

J'utilise OPTIONAL MATCH au lieu de MATCH et essayer d'obtenir les autorisations ponctuelles aussi.