2017-08-11 67 views
1

我想重新實現一個使用Neo4j的Web應用程序的ACL系統。匹配多個路徑之一(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

感謝您的任何洞察力,如果有意義,我願意重構圖形,因爲這只是概念的早期證明。

+0

也許你可以編輯你的問題,並把這裏一些Cypher查詢來創建一個初始數據集和預期的結果......謝謝。 –

回答

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並試圖獲得一次性權限太。