基于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()    

我如何编写一个 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()

我们首先递归地获取所有组成员。 然后获取用户及其组有权访问的所有资源。 然后递归遍历所有继承的资源。 最后,过滤所需的资源。 仅当您想查看允许访问的关系时才需要最后一行。