在Marklogic Query控制台中控制数据库和文档访问

时间:2018-01-13 04:25:48

标签: marklogic

您能否指导我如何在MarkLogic中设置数据库级别的只读访问权限。 对于数据库中的每个文档,我都设置了一个访问权限,如下所示

<sec:permission xmlns:sec="http://marklogic.com/xdmp/security">
<sec:capability>read</sec:capability>
<sec:role-id>rest-reader</sec:role-id> 
</sec:permission>

<sec:permission xmlns:sec="http://marklogic.com/xdmp/security">
<sec:capability>update</sec:capability>
<sec:role-id>rest-writer</sec:role-id>
</sec:permission>

但是仍然从ML控制台,我能够删除这些文件。我以前登录到Query控制台的用户没有rest-writer访问权限。

如果需要更多详细信息,请与我们联系。谢谢。

2 个答案:

答案 0 :(得分:1)

如果您对数据库中的每个文档都有明确的read权限,那么您应该只能授予QConsole只读用户qconsole-userrest-reader角色。

授予qconsole-user授予他们访问QConsole的权限,授予rest-reader将授予他们read访问这些文档的权限。

删除rest-reader角色会使用户只有qconsole-user角色,并且会阻止用户使用这些显式权限查看内容数据库中的任何文档。

其他角色可能会导致其他权限和行为,但只有这两个角色,用户应该只能阅读文档并且无法写入。

如果您的用户能够删除这些文档,那么他们可能拥有授予这些权利的其他角色和权限。

要演示,请对安全数据库运行以下命令,然后在QConsole中测试以read-only-user身份登录并尝试删除其中一个文档:

xquery version "1.0-ml";
import module namespace sec="http://marklogic.com/xdmp/security" at 
    "/MarkLogic/security.xqy";

sec:create-user(
    "read-only-user",
    "A test user demonstrating read-only access",
    "password",
    ("qconsole-user", "rest-reader"), 
    (), (), ()
  )

答案 1 :(得分:0)

Mads Hansen举了一个很好的例子来演示用户权限和测试,以确保您可以看到如何为用户提供有限的读取文档访问权限并使用查询控制台 - 一组重要的权限供用户探索数据。但是,根据您对原始评论的回复,我认为了解如何查找文档和用户访问权限的练习对于故障排除非常重要。

请参阅以下脚本。它必须以管理员用户身份运行,或者具有执行权限&user-get-roles&#39;并且可能是&#39; xdmp-invoke-function&#39;

xquery version "1.0-ml";
import module namespace sec="http://marklogic.com/xdmp/security" at 
    "/MarkLogic/security.xqy";

let $sec-db := xdmp:security-database()
let $uris := cts:uri-match('*')[1 to 20]
let $user := 'test-a-user'

(: run on the security database :)
let $role-report := xdmp:invoke-function(function(){
    let $direct-roles := xdmp:role(sec:user-get-roles($user))
    let $roles := (xdmp:role-roles(sec:user-get-roles($user)), $direct-roles)
    return <roles>{
      for $role-id in $roles
      return element {'role'} {
        attribute {'id'} {$role-id},
        attribute {'directly-attached'} {if ($direct-roles = $role-id) then '1' else '0'},
        xdmp:role-name($role-id)
      }
    }
    </roles>
  }, <options xmlns="xdmp:eval">
      <database>{$sec-db}</database>
    </options>
)

let $doc-report := <doc-access>
  {
    for $uri in $uris
      return for $permission in xdmp:document-get-permissions($uri)
        where $permission/*:capability = 'update' and $role-report//role/@id = $permission/*:role-id
        return <match uri='{$uri}' capability='update'>{xdmp:role-name($permission/*:role-id)}</match>
  }
  </doc-access>

return element {'report'} {
  if($role-report//role/text() = 'admin')
    then element {'attention'} {'Admin role found - access to all documents'}
    else (
      $role-report,
      $doc-report
    )
}

填写有问题的用户名和一系列URI(我的样本中只抓了20个)

如果admin的任何直接或继承角色将导致以下报告:

<report>
    <attention>Admin role found - access to all documents</attention>
</report>

否则,您将获得该用户(直接或继承)的所有角色以及具有更新访问权限(以及匹配角色)的所有角色的报告。这应该足以排除权限 - 特别是对继承的权限。它不是生产代码。如果需要,您还可以修改它以查找读取或执行。它也是使用sec命名空间函数中的一些项的一个示例。

<report>
  <roles>
    <role id="15240420431168313686" directly-attached="0">test-b</role>
    <role id="7089338530631756591" directly-attached="0">rest-reader</role>
    <role id="13041542794130379697" directly-attached="0">rest-extension-user</role>
    <role id="15520654661378671735" directly-attached="0">rest-writer</role>
    <role id="15240420431090884371" directly-attached="1">test-a</role>
  </roles>
  <doc-access>
    <match uri="/foo/bar.xml" capability="update">test-b</match>
  </doc-access>
</report>