使用带有父层次结构检查的 gremlin 查询 ACL 图
Query ACL graph using gremlin with parent hierarchy check
my ACL graph
在摘要中,有权访问 Folder1 的每个用户或组都将有权访问 File1
usecase #1 - 检查 user1 对 Folder1 的访问权限,这适用于以下 gremlin
g.V().has('user','userId','user1').
emit().
until(__.not(outE('member_of'))).
repeat(out('member_of')).
filter(outE('has_permission').has('permission','VS_F').
inV().has('folder','folderId','Folder1')).hasNext()
用例 #2 - 正在检查 user1 对 File1 的访问权限,如何修改上面的 gremlin 来实现这个?我对 gremlin 还很陌生,并为我的雇主在 janusgraph 上做了一个 POC。
首先要做的事情:您应该始终从人们可以 运行 创建您的示例图的脚本开始。此外,格式化您问题中的代码也无妨。
话虽如此,这是创建图表的脚本:
g = TinkerGraph.open().traversal()
g.addV('user').property('userId','user1').as('u1').
addV('user').property('userId','user2').as('u2').
addV('user').property('userId','user3').as('u3').
addV('group').property('groupId','group1').as('g1').
addV('group').property('groupId','group2').as('g2').
addV('group').property('groupId','group3').as('g3').
addV('folder').property('folderId','folder1').as('f1').
addV('file').property('fileId','file1').
addE('in_folder').to('f1').
addE('member_of').from('u1').to('g1').
addE('member_of').from('u2').to('g2').
addE('member_of').from('u3').to('g3').
addE('member_of').from('g3').to('g1').
addE('has_permission').from('g1').to('f1').
addE('has_permission').from('u2').to('f1').iterate()
...以及您要查找的查询:
g.V().has('file','fileId','file1').
until(inE('has_permission')).
repeat(out('in_folder')).as('folder').
V().has('user','userId','user1').
emit().
until(__.not(outE('member_of'))).
repeat(out('member_of')).
filter(out('has_permission').where(eq('folder'))).hasNext()
my ACL graph
在摘要中,有权访问 Folder1 的每个用户或组都将有权访问 File1
usecase #1 - 检查 user1 对 Folder1 的访问权限,这适用于以下 gremlin
g.V().has('user','userId','user1').
emit().
until(__.not(outE('member_of'))).
repeat(out('member_of')).
filter(outE('has_permission').has('permission','VS_F').
inV().has('folder','folderId','Folder1')).hasNext()
用例 #2 - 正在检查 user1 对 File1 的访问权限,如何修改上面的 gremlin 来实现这个?我对 gremlin 还很陌生,并为我的雇主在 janusgraph 上做了一个 POC。
首先要做的事情:您应该始终从人们可以 运行 创建您的示例图的脚本开始。此外,格式化您问题中的代码也无妨。
话虽如此,这是创建图表的脚本:
g = TinkerGraph.open().traversal()
g.addV('user').property('userId','user1').as('u1').
addV('user').property('userId','user2').as('u2').
addV('user').property('userId','user3').as('u3').
addV('group').property('groupId','group1').as('g1').
addV('group').property('groupId','group2').as('g2').
addV('group').property('groupId','group3').as('g3').
addV('folder').property('folderId','folder1').as('f1').
addV('file').property('fileId','file1').
addE('in_folder').to('f1').
addE('member_of').from('u1').to('g1').
addE('member_of').from('u2').to('g2').
addE('member_of').from('u3').to('g3').
addE('member_of').from('g3').to('g1').
addE('has_permission').from('g1').to('f1').
addE('has_permission').from('u2').to('f1').iterate()
...以及您要查找的查询:
g.V().has('file','fileId','file1').
until(inE('has_permission')).
repeat(out('in_folder')).as('folder').
V().has('user','userId','user1').
emit().
until(__.not(outE('member_of'))).
repeat(out('member_of')).
filter(out('has_permission').where(eq('folder'))).hasNext()