Graph 使用gremlin查询ACL/权限图?

Graph 使用gremlin查询ACL/权限图?,graph,permissions,acl,gremlin,gremlin-server,Graph,Permissions,Acl,Gremlin,Gremlin Server,我的权限图如下所示: 在这种情况下, user1通过Group1拥有对folder1的权限 user2拥有直接权限,而无需任何组,尽管该用户是group2的一部分,其中group2无权访问folder1 user3具有通过组层次结构的权限,而不是直接访问组到文件夹的权限 我能够编写单独的gremlin查询,以确定用户是否具有通过其中一个组的权限和用户直接权限 通过组检查权限 用户直接权限 但我无法在单个查询中找到逻辑,该查询可以检查direct和group以查看用户是否具有权限 有人能帮我吗?

我的权限图如下所示:

在这种情况下,

  • user1
    通过
    Group1
    拥有对
    folder1
    的权限
  • user2
    拥有直接权限,而无需任何组,尽管该用户是
    group2
    的一部分,其中
    group2
    无权访问
    folder1
  • user3
    具有通过组层次结构的权限,而不是直接访问组到文件夹的权限
  • 我能够编写单独的gremlin查询,以确定用户是否具有通过其中一个组的权限和用户直接权限

    通过组检查权限 用户直接权限 但我无法在单个查询中找到逻辑,该查询可以检查direct和group以查看用户是否具有权限

    有人能帮我吗?

    您的图表:

    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').
      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('user','userId',<userId>).
      emit().
        until(__.not(outE('member_of'))).
        repeat(out('member_of')).
      filter(out('has_permission').has('folder','folderId',<folderId>)).hasNext()
    
    谢谢你,丹尼尔。 只是为了使上述查询复杂化,以检查用户是否已授予权限。 下面是像我一样寻找的任何人的答案

    gremlin> g.V().has('user','userId','user3').
               emit().
                 until(__.not(outE('member_of'))).
                 repeat(out('member_of')).
               filter(outE('has_permission').has('permission','V').inV().has('folder','folderId','folder1')).hasNext()
    ==>true
    
    
    

    谢谢你,丹尼尔。这有助于判断用户是否有权限。接下来的问题是,上面的查询有助于判断用户是否有权限,我如何做额外的过滤,用户到底有什么权限。在图中,has_permission边缘标签具有属性'permission'和一些权限,比如'write'gremlin>g.V().has('user','userId',110143)。emit().until(.not(out('member_of'))。repeat(out('member_of'))。filter(out('has_permission')。has('folder','folderId',191099))。hasNext()=>true gremlin>g.V().has('user','userId',110143)。emit()。直到(.not(outE('member'u of'))。repeat(out('member'u of'))。filter(out('has'u permission'))。has('permission','V')。has('folderId',191099))。hasNext()==>false为什么第二个查询返回false,尽管用户拥有该'V'权限?得到了我的答案,谢谢。我的做法如下。gremlin>g.V()。has('user','userId','50781)。emit()。直到('uuuuu.not(outE)('member_of'))。重复(out('member_of'))。筛选(outE('has_permission')。has('permission','V')。inV()。has('folder','folderId',230383))。值m
    g.V().has('user','userId',<userId>).
      emit().
        until(__.not(outE('member_of'))).
        repeat(out('member_of')).
      filter(out('has_permission').has('folder','folderId',<folderId>)).hasNext()
    
    gremlin> g.V().has('user','userId','user1').
               emit().
                 until(__.not(outE('member_of'))).
                 repeat(out('member_of')).
               filter(out('has_permission').has('folder','folderId','folder1')).hasNext()
    ==>true
    gremlin> g.V().has('user','userId','user2').
               emit().
                 until(__.not(outE('member_of'))).
                 repeat(out('member_of')).
               filter(out('has_permission').has('folder','folderId','folder1')).hasNext()
    ==>true
    gremlin> g.V().has('user','userId','user3').
               emit().
                 until(__.not(outE('member_of'))).
                 repeat(out('member_of')).
               filter(out('has_permission').has('folder','folderId','folder1')).hasNext()
    ==>true
    
    gremlin> g.V().has('user','userId','user3').
               emit().
                 until(__.not(outE('member_of'))).
                 repeat(out('member_of')).
               filter(outE('has_permission').has('permission','V').inV().has('folder','folderId','folder1')).hasNext()
    ==>true