匹配多个路径之一 (ACL)

Matching one of multiple paths (ACL)

我正在尝试使用 Neo4j 为 Web 应用程序重新实施 ACL 系统。

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

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

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

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

我想问"Does the User have a given Permission on a given Task or Organization (whether through a Role or Permission assigned directly to a node)?"

我已经部分回答了:

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 关系,它将用户连接到组限制超边缘。如果他们通过角色成员资格或分配的权限获得权限,我该如何修改查询以便获得真实结果?一次性许可超边的节点Label为:UserPermissionRestriction.

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

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

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 并尝试获得一次性权限。