无法创建自定义用户权限以限制内容

时间:2016-10-01 12:25:36

标签: rest marklogic marklogic-8 roxy

我正在努力让我的用户权限/权限/角色设置正确,以获得我需要的行为。

我正在使用MarkLogic 8和Roxy来创建和部署应用程序。

此应用程序具有不同的用户,其内容应限制为单个用户。但他们也参与了他们需要合作的项目。

我看过这个helpful blogdiscussion on github issue 303,但仍然无法做到正确。

默认的roxy app用户角色:

<role>
  <role-name>${app-role}</role-name>
  <description>A role for users of the ${app-name} application</description>
  <role-names>
  </role-names>
  <permissions>
    <permission>
      <capability>execute</capability>
      <role-name>${app-role}</role-name>
    </permission>
    <permission>
      <capability>update</capability>
      <role-name>${app-role}</role-name>
    </permission>
    <permission>
      <capability>insert</capability>
      <role-name>${app-role}</role-name>
    </permission>
    <permission>
      <capability>read</capability>
      <role-name>${app-role}</role-name>
    </permission>
  </permissions>
  <collections>
  </collections>
  <privileges>
    <privilege>
      <privilege-name>xdmp:value</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:add-response-header</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:invoke</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:with-namespaces</privilege-name>
    </privilege>
  </privileges>
</role>

我的自定义角色:

<role>
  <role-name>sccss-user</role-name>
  <description>sccss default role</description>
  <role-names>
    <!-- TODO test which roles we really need -->
    <!--
    <role-name>alert-user</role-name>    
    <role-name>alert-internal</role-name> 
    <role-name>rest-admin</role-name> 
    <role-name>rest-writer-internal</role-name>
    <role-name>rest-reader</role-name> 
    <role-name>network-access</role-name>
    <role-name>qconsole-user</role-name>
    -->
    <!-- cluey app role for rest api access TODO replace with dedicated api user and role 

    <role-name>${app-role}</role-name>
    -->

  </role-names>
  <permissions>
  </permissions>
  <collections>
  </collections>
  <privileges>
    <!-- HK -->
    <!--
    <privilege>
      <privilege-name>any-uri</privilege-name>
    </privilege>
    -->
    <privilege>
      <privilege-name>devices-uri</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>any-collection</privilege-name>
    </privilege>
    <!-- to make this role have acces to the REST API-->
    <privilege>
      <privilege-name>rest-reader</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>rest-writer</privilege-name>
    </privilege>
    <!-- TODO test this
    <privilege>
      <privilege-name>xdmp:value</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:add-response-header</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:invoke</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:with-namespaces</privilege-name>
    </privilege>
  </privileges>
  -->
</role>

我已经测试并尝试了上面博客中描述的内容但是使用这些设置我无法访问任何文档,显然没有其他扩展访问权限。 如果我向用户提供{app-role},则会出现用户可以看到其他用户的私人内容的问题...因为所有用户都有“休息读者”角色... 所以我需要限制default-app角色不使用rest-reader角色并使用rest-reader权限但是不能让它工作......

我正在考虑的一个选项是对受限制的内容使用document-insert()权限,但如果我能正确设置它,那么这应该可以使用正确的角色和权限,对吗?

ADDITION

回复Grtjn的回答:你的评论,我认为我对REST角色感到困惑。如果我在git上的roxy应用程序中查看default roles,那些看起来是空的,但是当我将我的roxy应用程序类型设置为REST应用程序时,事情似乎变得更加复杂。主要的困惑是我需要哪些角色和特权才能使第二个(独立)角色能够使用REST端点?什么是xdmp :(值,add-response-header,invokes等)特权正好做和需要?在我的示例中,如果用户能够访问REST API,则需要以下角色:

      <role-name>${app-role}</role-name>
      <!-- we need this to amp internal privileges-->
      <role-name>alert-user</role-name>    
      <role-name>alert-internal</role-name> 
      <role-name>rest-admin-internal</role-name> 

然后我们进入讨论,如果休息读者应该是一个特权或角色?

所以更具体的问题:

访问由roxy rest类型应用程序创建的REST端点需要的最小角色/权限集是什么?

1 个答案:

答案 0 :(得分:1)

我建议采取以下方法:

使用app-role执行应用程序,而不是以内容访问开头。因此,从该角色中删除默认权限,并为其提供rest-reader / rest-writer权限,以及运行MLCP等的一些权限。

接下来,确保REST扩展以及Roxy未直接部署的任何其他内容获得读取和执行文档权限。考虑使用未加载部署模式的自定义代码,sql-views或模式创建的触发器和警报等。我们在slush-marklogic-node中使用的change_permissions函数可以作为如何处理此问题的示例:https://github.com/marklogic/slush-marklogic-node/pull/298/files#diff-a529d1d70bd21866e1d12eda3a99f7b6R96 < / p>

为每个需要单独授予访问权限的内容部分创建专用角色。如果您只需要一个用户可以访问一组文档,那么您将需要一个特定于用户的角色。如果您还有一组只能由项目成员访问的文档,那么您还需要一个项目特定的角色。如果您还需要区分读/写,请为每个角色分配两个角色(两个用户,两个项目角色)。这些角色没有priv,也不应该继承角色(除了写入继承相应的read角色之外)。

获得读/写角色后,您可以开始考虑如何在摄取时正确应用它们以获取文档权限。由于这种复杂程度,您可能希望避免默认权限,并明确选择文档权限。 xdmp:document-insert,MLCP和/ v1 / documents都具有明确的文档权限,因此您应该对这些权限进行合理的控制。

ADDITION

注意Roxy开箱即用的ml-config文件。它未针对REST类型应用程序进行适当调整。这就是slush-marklogic-node生成器修补ml-config:https://github.com/marklogic/slush-marklogic-node/blob/master/slushfile.js#L346

的原因

对REST api具有读访问权限的最低要求是rest-writer priv,并具有对REST api的更新访问权限。 REST扩展从模块数据库运行,而不是从文件系统运行,因此您还需要模块访问。上面提到的change_permissions函数为你修复了这个问题。

无论如何,我的一般建议是使用app-role进行应用程序执行,如前所述,以及数据访问的其他角色。任何想要使用该应用程序的用户都应该继承app-role,以及其他一些角色,以提供适当的数据访问权限。

HTH!