基于Vertex属性的ACL图分层循环

时间:2019-08-28 21:44:13

标签: acl graph-databases gremlin janusgraph

这是我的示例图

var min = 0;
var hour = 0;
var timer = true;

alert("Testing Timer");

    do{
        sec += 10; //Needs to pause for 5 secs after this line
        console.log(sec);
            if(sec >= 60){
                alert("It's " + hour + " : " + min + " : " + sec);
                min += 5;
                sec = 0;
                if(min >= 60)
                {
                    hour += 1;
                    min = 0;
                }
            }
    }while(timer === true);```
  • 文件夹f2继承自f1,这意味着有权访问f1的用户和组也将有权访问f2,f3也是如此。
  • 用户对文件夹的访问可以来自该组的一个组或该组的父组

我如何编写一个gremlin查询来检查'user1'的权限是否对f3具有权限?

以下查询可以在不通过继承属性检查父文件夹权限的给定文件夹中获取对用户或其组之一的直接访问权限。

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

1 个答案:

答案 0 :(得分:2)

不使用过滤器,而是继续遍历:

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

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