匹配多个路径之一 (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
并尝试获得一次性权限。
我正在尝试使用 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
并尝试获得一次性权限。