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

在Marklogic查询控制台中控制数据库和文档访问,marklogic,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>

请您指导我如何在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>

阅读
rest阅读器
更新
休息作家
但仍然可以从ML控制台删除这些文档。我用来登录查询控制台的用户没有rest编写器访问权限


如果需要更多细节,请告诉我。谢谢。

如果您对数据库中的每个文档都有明确的
读取
权限,您应该能够将
QConsole用户
rest阅读器
角色授予您的QConsole只读用户

授予
qconsole用户
可以访问qconsole,授予
rest阅读器
可以访问这些文档

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

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

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

要演示,请对安全数据库运行以下操作,然后在QConsole中以此
只读用户身份测试登录,并尝试删除其中一个文档:

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

Mads Hansen给出了一个很好的示例来演示用户权限,并进行了一项测试,以确保您可以看到如何为用户提供有限的读取文档的权限,以及如何使用查询控制台—这是用户浏览数据的一组重要权限。但是,根据您对我最初评论的回复,我认为了解如何找到对文档和用户的访问在故障排除中很重要

请看下面的脚本。它必须作为管理员用户或具有执行权限“用户获取角色”和可能的“xdmp调用函数”的用户运行

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
    )
}
xquery版本“1.0-ml”;
导入模块命名空间sec=”http://marklogic.com/xdmp/security“在
“/MarkLogic/security.xqy”;
让$sec db:=xdmp:security-database()
让$uris:=cts:uri匹配('*')[1到20]
let$user:=“测试用户”
(:在安全数据库上运行:)
let$role report:=xdmp:invoke函数(函数(){
让$directroles:=xdmp:role(sec:user-get-roles($user))
let$roles:=(xdmp:role-roles(sec:user-get-roles($user)),$direct-roles)
返回{
对于$roles中的$role id
返回元素{'role'}{
属性{'id'}{$role id},
属性{'directive-attached'}{如果($directroles=$role id),则为'1'或'0'},
xdmp:角色名称($role id)
}
}
}, 
{$sec db}
)
让$doc报告:=
{
对于$uri中的$uri
在xdmp中返回$permission:document get permissions($uri)
其中$permission/*:capability='update'和$role report//role/@id=$permission/*:role id
返回{xdmp:role name($permission/*:role id)}
}
返回元素{'report'}{
如果($role report//role/text()=“admin”)
然后元素{'attention'}{'Admin角色已找到-访问所有文档'}
否则(
$role报告,
$doc报告
)
}
填写有问题的用户名和一系列URI(我刚刚在示例中抓取了20个)

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

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

找到管理员角色-访问所有文档
否则,您将返回该用户的所有角色(直接或继承)以及具有更新访问权限的所有URI(以及匹配角色)的报告。这对于权限疑难解答应该足够了,尤其是对于继承的权限。这不是生产代码。如果需要,还可以修改它以查找读取或执行。这也是使用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>

测试b
rest阅读器
rest扩展用户
休息作家
测试a
测试b

在数据库级别没有只读访问。您在查询控制台中使用的用户的所有角色(直接角色和继承角色)是什么?您好David,感谢您的评论,我试图在查询控制台上提取登录用户的角色,分配给此用户的唯一角色是rest reader。我也删除了这个角色,但仍然可以删除文档。