如何检查用户是不是能够在 marklogic 数据库中更新或插入文档?

Posted

技术标签:

【中文标题】如何检查用户是不是能够在 marklogic 数据库中更新或插入文档?【英文标题】:how to check whether a user is able to update or insert a document in marklogic database?如何检查用户是否能够在 marklogic 数据库中更新或插入文档? 【发布时间】:2021-08-28 10:18:02 【问题描述】:

如何检查用户是否能够更新或插入marklogic数据库中的任何文档?

例如,有4个用户,有的有更新权限,有的有权限读取marklogic数据库中的文档

try
    let $uri := abc.xml
    let $doc : <a/>
    if (condition)
    then check whether the current user is able to update or insert the doc in marklogic or not , if it is not then throw fn:error()
    else 
    xdmp:document-insert($uri,$doc) (:it will throw error, when user have no permission to insert the doc:)
    
catch($e)
$e

【问题讨论】:

【参考方案1】:

用户插入和更新文档所需的权限将取决于用户的显式角色和权限,以及默认权限和对文档设置的任何显式权限。

https://docs.marklogic.com/guide/admin/security#chapter

https://docs.marklogic.com/xdmp:document-insert

所需权限 如果插入新文档,则还需要 unprotected-uri 权限(仅当 URI 不受保护时)、any-uri 权限或适当的 URI 权限。如果向文档添加不受保护的集合,则需要unprotected-collections 权限;如果添加受保护的集合,用户必须具有更新集合的权限或any-collection 权限。

如果您要更新文档,那么您必须具有为该文档指定的必要权限(可以包括默认权限)。

您可以使用xdmp:document-get-permissions() 列出文档的权限或使用Query Console Explore 选择文件并查看权限选项卡。 您可以使用sec:user-roles() 列出用户角色,使用sec:user-privileges() 列出权限

使用 xdmp:document-get-permissions 返回哪些角色对该特定 URI 具有哪些权限,然后将其与附加到感兴趣的用户的角色相交,您将知道用户是否可以访问或更新文档。

因此,要检查用户是否具有插入或更新 URI 的能力,您需要获取该用户的角色,然后查看默认权限或文档权限中的权限是否具有该角色以及插入或更新能力:

xquery version "1.0-ml";
import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
let $name := "user-foo"
let $uri := "/bar.xml"
let $user-roles := xdmp:invoke-function(
  function() sec:user-get-roles($name) , 
  <options xmlns="xdmp:eval">
    <database>xdmp:security-database()</database>
  </options>)
let $permissions := (xdmp:default-permissions(), xdmp:document-get-permissions($uri))
return
 exists($permissions[sec:capability=('insert', 'update') and sec:role-id/xdmp:role-name(.) = $user-roles])

【讨论】:

以上是关于如何检查用户是不是能够在 marklogic 数据库中更新或插入文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MarkLogic 中处理不区分大小写的 SPARQL 数据

sh 检查markLogic日志

如何在Marklogic或Couchbase中进行xslt类型转换?

如何修复 MarkLogic“文件太大”森林合并错误?

在不同于使用 XQuery 处理的数据库上进行查询

Android Google Map如何检查用户是不是在标记矩形区域