在Marklogic查询控制台中控制数据库和文档访问
请您指导我如何在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>
<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。我也删除了这个角色,但仍然可以删除文档。