我正在尝试使用Neo4j为网络应用重新实施ACL系统。
应用程序具有分层组织,其叶节点可以拥有任务。
有角色,有权限。可以将用户分配到组织或任务中的角色。这样做应该赋予他们分配给该组织中的角色,任何后代和任何拥有的任务的权限。
此外,某些用户被分配了一个不属于某个角色的组织的一次性权限。
我使用超边缘设置图形来模拟用户x角色x组织和用户x权限x组织交叉点。
我试图询问"用户是否对给定的任务或组织具有给定的权限(无论是通过直接分配给节点的角色还是权限)?"
我已经部分回答了它:
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
。
感谢您的任何见解,如果有意义,我可以重新构建图表,因为这只是概念的早期证明。
答案 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
并试图获得一次性权限。