MarkLogic数据库级只读权限配置及文档删除权限异常排查
排查MarkLogic数据库级别只读权限配置问题
看起来你已经给文档设置了细分的权限,但无rest-writer权限的用户仍能删除文档,这大概率是因为MarkLogic的权限是累加生效的,用户可能通过其他角色或数据库配置获得了删除所需的权限。咱们一步步来排查:
1. 检查用户的角色及权限继承
首先确认目标用户实际拥有的角色,以及这些角色是否包含删除/更新权限:
在Query Console执行以下XQuery,替换成你的目标用户名:
xdmp:user-roles("your-target-username")
然后逐个检查这些角色的权限,重点看是否有:
- 自带角色如
admin、xdmp-document-update(这类角色默认拥有全数据库的更新/删除权限) - 自定义角色中被授予了该数据库的
update权限(MarkLogic中update权限包含删除操作)
另外,别忘了检查角色的继承链,比如rest-reader是否被修改过继承了其他带权限的角色:
xdmp:role-inherited-roles("rest-reader")
2. 核查数据库的默认权限
数据库层面的默认权限会自动附加到所有文档上,可能覆盖你设置的文档级权限。执行以下XQuery查看目标数据库的默认权限:
xdmp:database-default-permissions(xdmp:database("your-database-name"))
如果结果里存在某个角色的update权限,那么所有拥有该角色的用户都能删除数据库内的文档,不管你给单个文档设置了什么权限。
3. 验证目标文档的实际权限
有时候插入文档时可能会自动附加额外权限(比如执行插入操作的用户的默认权限),所以要确认目标文档的实际权限:
xdmp:document-permissions("/path/to/your-test-document.xml")
对比返回结果和你配置的权限,看是否有额外的update权限被添加。
4. 确认Query Console的执行身份
最后检查一下Query Console右上角显示的当前用户和角色,确保你测试时用的确实是无rest-writer权限的用户,没有切换到其他身份。
核心逻辑提醒:MarkLogic的权限是"只要有一个角色满足权限要求,操作就允许",所以哪怕你给文档加了只读权限,只要用户通过其他途径获得了更新权限,就能执行删除操作。
内容的提问来源于stack exchange,提问作者Shrikant Lohiya
相关产品推荐
相关产品推荐

