1

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

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

此应用程序具有不同的用户,这些用户的内容应仅限于单个用户。但他们也参与需要共同协作的项目。

我看过这个有用的博客关于 github 问题 303 的讨论,但仍然无法正确处理。

默认 roxy 应用用户角色:

<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} 它给出了用户可以看到其他用户的私人内容的问题......因为所有用户都有'rest-reader'角色......所以我需要限制默认 - app 角色不使用 rest-reader 角色并使用 rest-reader 权限但不能让它工作......

我正在考虑的一种选择是document-insert()对受限内容使用权限,但如果我可以正确设置,这应该可以通过正确的角色和权限实现,对吧?

添加

回应 Grtjn 的回答:谢谢 4 您的评论,我想我对 REST 角色感到困惑。如果我在 git 上查看 roxy 应用程序中的默认角色,这些角色看起来是空的,但是当我将我的 roxy 应用程序类型设置为 REST 应用程序时,事情似乎变得更加复杂。主要的困惑是我需要哪些角色和权限才能让第二个(独立)角色能够使用 REST 端点?xdmp:(value,add-response-header, invokes etc) 权限到底在做什么和需要什么?在我的示例中,为了让用户能够访问 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 端点需要的最小角色/权限集是多少?

4

1 回答 1

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

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

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

添加

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

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

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

于 2016-10-03T07:17:43.940 回答