2017-08-11 7 views
1

私はNeo4jを使用してWebアプリケーションのACLシステムを再実装しようとしています。複数のパス(ACL)の1つに一致する

アプリケーションには階層組織があり、そのリーフノードにはタスクがあります。

権限があるロールがあります。ユーザーは、組織またはタスク内の役割に割り当てることができます。そうすることで、組織、下位企業、所有タスク内の役割に割り当てられた権限が与えられます。

さらに、一部のユーザーには、役割の一部ではない組織に対する一回限りのアクセス許可が割り当てられます。

ハイパーエッジを使ってグラフを設定して、ユーザー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関係で探していますので。ロールメンバーシップまたは割り当てられた権限のいずれかのアクセス権を持っている場合、真の結果を得るためにクエリを変更するにはどうすればよいですか? 1回限りの許可ハイパーエッジのノードラベルは: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を使用し、一回限りのアクセス権を取得しようとしていますあまりにも。

関連する問題