基于Vertex的ACL图分层循环属性
ACL graph hierarchical looping based on Vertex property
这是我的示例图
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').property('inheritance',false).as('f1').
addV('folder').property('folderId','folder2').property('inheritance',true).as('f2').
addV('folder').property('folderId','folder3').property('inheritance',true).as('f3').
addV('file').property('fileId','file1').
addE('in_folder').to('f1').
addE('in_folder').from('f2').to('f1').
addE('in_folder').from('f3').to('f2').
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()
- 文件夹 f2 继承自 f1,这意味着可以访问 f1 的用户和组也可以访问 f2,f3 也是如此。
- 用户对文件夹的访问可以来自组或组的父组
我如何编写一个 gremlin 查询来检查 'user1' 对 f3 有权限?
下面的查询可以获取对给定文件夹中的用户或其组之一的直接访问,它不通过继承检查父文件夹权限 属性。
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()
不使用过滤器,继续遍历:
g.V().has('user', 'userId', 'user1').emit().repeat(out('member_of'))
.out('has_permission').emit().repeat(__.in('in_folder').has('inheritance',true))
.has('folder', 'folderId', 'folder3')
.path().unfold().valueMap()
我们首先递归地获取所有组成员。
然后获取用户及其组有权访问的所有资源。
然后递归遍历所有继承的资源。
最后,过滤所需的资源。
仅当您想查看允许访问的关系时才需要最后一行。
这是我的示例图
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').property('inheritance',false).as('f1').
addV('folder').property('folderId','folder2').property('inheritance',true).as('f2').
addV('folder').property('folderId','folder3').property('inheritance',true).as('f3').
addV('file').property('fileId','file1').
addE('in_folder').to('f1').
addE('in_folder').from('f2').to('f1').
addE('in_folder').from('f3').to('f2').
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()
- 文件夹 f2 继承自 f1,这意味着可以访问 f1 的用户和组也可以访问 f2,f3 也是如此。
- 用户对文件夹的访问可以来自组或组的父组
我如何编写一个 gremlin 查询来检查 'user1' 对 f3 有权限?
下面的查询可以获取对给定文件夹中的用户或其组之一的直接访问,它不通过继承检查父文件夹权限 属性。
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()
不使用过滤器,继续遍历:
g.V().has('user', 'userId', 'user1').emit().repeat(out('member_of'))
.out('has_permission').emit().repeat(__.in('in_folder').has('inheritance',true))
.has('folder', 'folderId', 'folder3')
.path().unfold().valueMap()
我们首先递归地获取所有组成员。 然后获取用户及其组有权访问的所有资源。 然后递归遍历所有继承的资源。 最后,过滤所需的资源。 仅当您想查看允许访问的关系时才需要最后一行。