匹配多个路径之一(ACL)

时间:2017-08-11 15:37:21

标签: neo4j cypher acl

我正在尝试使用Neo4j为网络应用重新实施ACL系统。

应用程序具有分层组织,其叶节点可以拥有任务。

有角色,有权限。可以将用户分配到组织或任务中的角色。这样做应该赋予他们分配给该组织中的角色,任何后代和任何拥有的任务的权限。

此外,某些用户被分配了一个不属于某个角色的组织的一次性权限。

我使用超边缘设置图形来模拟用户x角色x组织和用户x权限x组织交叉点。

Current data model

我试图询问"用户是否对给定的任务或组织具有给定的权限(无论是通过直接分配给节点的角色还是权限)?"

我已经部分回答了它:

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`

但是这只适用于角色限制,因为我只关注MEMBER_OF关系,它将用户连接到组限制超边缘。如果通过角色成员身份或分配的权限获得权限,我如何修改查询以获得真实结果?一次性权限超边的节点标签为:UserPermissionRestriction

感谢您的任何见解,如果有意义,我可以重新构建图表,因为这只是概念的早期证明。

1 个答案:

答案 0 :(得分:0)

我不知道我是否完全理解了您的问题,但我相信以下查询应该有效:

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`

我使用OPTIONAL MATCH代替MATCH并试图获得一次性权限。