Element Level Security异常排查:除用户与保护路径外需检查项咨询
排查MarkLogic保护路径跨实例不一致的额外检查项
这确实是个让人头疼的权限不一致问题,除了你已经排查的用户与保护路径配置,我建议重点检查以下几个差异点:
1. 保护路径的生效配置细节
- 确认两个实例上
/record/historical的保护路径是否都设置了正确的应用范围:比如是否都指定了apply-to="descendants"(覆盖所有子路径),有没有某个实例误设为仅应用到当前节点(apply-to="self"),导致子路径的权限规则不生效。 - 检查保护路径的权限绑定是否完整:比如
admin角色的权限是否明确包含了/record/historical及其子路径的读、更新、插入,有没有在某个实例上漏绑定了子路径的权限项。
2. 数据库与查询选项差异
- 验证两个实例的数据库是否启用了相同的安全特性:执行
xdmp:database-get-security-options(xdmp:database())对比输出,确认security-protected-paths是否都处于启用状态,有没有某个实例禁用了该功能。 - 检查查询时使用的选项:比如是否在某个实例的查询控制台默认使用了
unfiltered查询(可以通过xdmp:query-options()查看),无过滤查询可能绕过部分保护路径的权限校验逻辑。 - 确认数据库的无命名空间路径配置:检查是否有实例为
/record路径意外绑定了命名空间,导致保护路径的表达式无法匹配实际文档路径。
3. 角色与用户权限的隐性差异
- 对比
admin角色的权限继承链:执行xdmp:role-permissions("admin")和xdmp:role-roles("admin"),确认两个实例上该角色的直接权限、继承的角色是否完全一致。比如某个实例可能额外赋予了xdmp:read-protected-paths这类特殊权限,或者继承了security-admin角色导致权限范围不同。 - 检查
deployment用户的完整权限集:执行xdmp:user-permissions("deployment"),确认是否在某个实例上该用户被额外赋予了其他角色(比如read-all),或者权限被意外修改。
4. 文档索引与存储结构差异
- 验证路径索引配置:检查两个实例的数据库是否都为
/record/historical及其子路径创建了正确的路径索引,保护路径的权限校验依赖路径索引,如果某个实例缺失相关索引,查询子路径时可能无法正确识别受保护的节点。 - 对比文档存储结构:确认两个实例中
/record文档的存储方式是否一致,比如是否有实例将文档拆分为多个片段存储,导致子路径的权限规则无法正确应用。
5. 实例版本与安全数据库一致性
- 确认两个实例的精确版本号:虽然都是9.0-4,但要检查是否安装了不同的补丁(比如9.0-4.1 vs 9.0-4.0),MarkLogic的小补丁常修复安全模块的bug,可能导致保护路径行为差异。
- 同步验证
Security数据库:确认两个实例的Security数据库中,保护路径的定义是否完全相同(可以通过xdmp:protected-paths()导出对比),有没有某个实例的保护路径表达式被意外修改(比如大小写、斜杠位置错误)。
6. 查询上下文与事务状态
- 检查查询的事务模式:确认两个实例的查询控制台是否使用了相同的事务隔离级别(比如
snapshotvsread-committed),不同的事务模式可能影响权限检查的时机与结果。 - 验证查询的数据库与集合上下文:确认查询时是否都指向了同一个目标数据库,有没有误选了不同的集合,导致查询的文档范围不一致。
内容的提问来源于stack exchange,提问作者Alma Pellett
相关产品推荐
相关产品推荐

