【问题标题】:Create user that has permission only to given database创建仅对给定数据库具有权限的用户
【发布时间】:2015-12-10 08:09:15
【问题描述】:
我正在尝试在 MarkLogic 中创建对给定数据库具有权限的用户。我从 MarkLogic 文档页面阅读了Security Guide,发现您可以对给定的 URI、集合或函数设置权限。
集合的权限可以帮助我将数据库中的给定集合标记为仅对给定的用户集可读,但其他用户仍然可以创建和修改不同集合中的文档(或创建没有集合的文档)。
例如
我有两个数据库:
还有两个用户:
如何设置UserTest 对数据库Test 具有读取/更新/插入/执行权限并且不能修改或读取任何数据库Test2 的权限?
【问题讨论】:
标签:
permissions
marklogic
【解决方案1】:
每个数据库都可以与一个专用的安全数据库相关联。您描述用例的方式(“UserTest 将对数据库 Test 具有读取/更新/插入/执行权限,并且无法修改或读取任何数据库 Test2”),您可能需要考虑用于 Test 和 Test2 数据库的专用安全数据库.
另一种方法是对两个数据库的角色使用不同的 document 权限。您可以在插入时为给定角色在文档级别设置读取/更新/插入/执行权限,或使用 xdmp:document-add-permissions() (保留以前的权限)或 xdmp:document-set-permissions() 更改它们(覆盖以前的权限)插入后。例如,您可以有一个角色 Test-Reader 用于数据库 Test 和一个角色 Test2-Reader 用于数据库 Test2,并确保 (1) 您的 UserTest 用户具有 Test-Reader 角色(但不是 Test2-Reader 角色),并且(2) 插入到 Test 数据库中的所有文档都将读取功能与 Test-Reader 角色(但不是 Test2-Reader 角色)等配对。(其他功能相同。)
如果显式控制这听起来像是很多工作,请注意默认文档权限可以声明为在用户和角色级别隐式应用。
最后,如果您在文档插入期间根本没有设置任何权限(并且如果没有在用户或角色级别定义隐式/默认权限),则只有具有管理员角色的用户才能读取/更新/插入/执行。
这是理解和使用安全指南中文档权限的相关部分:https://docs.marklogic.com/guide/security/permissions#id_85471
【解决方案2】:
数据库没有用户级规范。但请记住,数据库不能单独访问 - 它可以通过链接到特定数据库的应用程序访问。除非您允许人们运行 eval 并允许他们针对另一个数据库进行评估,否则您的应用程序会将人们保留在指定的数据库中。 (注意:ML8 高级 HTTP 服务器对此进行了一些更改,因为您可以根据请求即时切换数据库 - 但仍然坚持使用单个数据库的规则。
我认为对您有用的唯一其他项目是能够定义用户可以写入哪些 URI 前缀,但这并不能否定应用程序级别决定访问哪个数据库这一事实。