我很难获得正确的用户权限/特权/角色设置,以获得我需要的行为。
我使用MarkLogic 8和Roxy创建和部署应用程序。
此应用程序有不同的用户,其内容应仅限于单个用户。但他们也参与了他们需要合作的项目。
我看过这个有帮助的博客和关于github问题303的探讨,但还是没能把它做好。
默认的roxy应用程序用户角色:
<role>
<role-name>${app-role}</role-name>
<description>A role for users of the ${app-name} application</description>
<role-names>
</role-names>
<permissions>
<permission>
<capability>execute</capability>
<role-name>${app-role}</role-name>
</permission>
<permission>
<capability>update</capability>
<role-name>${app-role}</role-name>
</permission>
<permission>
<capability>insert</capability>
<role-name>${app-role}</role-name>
</permission>
<permission>
<capability>read</capability>
<role-name>${app-role}</role-name>
</permission>
</permissions>
<collections>
</collections>
<privileges>
<privilege>
<privilege-name>xdmp:value</privilege-name>
</privilege>
<privilege>
<privilege-name>xdmp:add-response-header</privilege-name>
</privilege>
<privilege>
<privilege-name>xdmp:invoke</privilege-name>
</privilege>
<privilege>
<privilege-name>xdmp:with-namespaces</privilege-name>
</privilege>
</privileges>
</role>我的定制角色:
<role>
<role-name>sccss-user</role-name>
<description>sccss default role</description>
<role-names>
<!-- TODO test which roles we really need -->
<!--
<role-name>alert-user</role-name>
<role-name>alert-internal</role-name>
<role-name>rest-admin</role-name>
<role-name>rest-writer-internal</role-name>
<role-name>rest-reader</role-name>
<role-name>network-access</role-name>
<role-name>qconsole-user</role-name>
-->
<!-- cluey app role for rest api access TODO replace with dedicated api user and role
<role-name>${app-role}</role-name>
-->
</role-names>
<permissions>
</permissions>
<collections>
</collections>
<privileges>
<!-- HK -->
<!--
<privilege>
<privilege-name>any-uri</privilege-name>
</privilege>
-->
<privilege>
<privilege-name>devices-uri</privilege-name>
</privilege>
<privilege>
<privilege-name>any-collection</privilege-name>
</privilege>
<!-- to make this role have acces to the REST API-->
<privilege>
<privilege-name>rest-reader</privilege-name>
</privilege>
<privilege>
<privilege-name>rest-writer</privilege-name>
</privilege>
<!-- TODO test this
<privilege>
<privilege-name>xdmp:value</privilege-name>
</privilege>
<privilege>
<privilege-name>xdmp:add-response-header</privilege-name>
</privilege>
<privilege>
<privilege-name>xdmp:invoke</privilege-name>
</privilege>
<privilege>
<privilege-name>xdmp:with-namespaces</privilege-name>
</privilege>
</privileges>
-->
</role>我已经测试并尝试了上面博客中描述的内容,但是通过这些设置,我无法访问任何文档,显然也没有rest扩展访问权限。如果我给我的用户{app角色},就会出现这样的问题:用户可以看到其他用户的私有内容.因为所有的用户都有“休息阅读器”的角色.因此,我需要限制默认的应用程序角色,以不使用rest-读取器角色和使用rest-读取器特权,但不能让它工作……
我正在考虑的一种选择是对受限制的内容使用document-insert()权限,但是如果我能够正确地设置它,那么使用正确的角色和权限应该是可能的,对吗?
加法
在回复Grtjn的回答: thx 4你的评论,我想我对其余的角色感到困惑。如果我在git上查看roxy应用程序中的默认角色,这些看起来是空的,但是当我将我的roxy应用类型设置为REST应用程序时,事情似乎变得更加复杂了。主要的困惑是,我需要哪些角色和特权才能使用REST端点?什么是xdmp:(值,添加-响应-头,调用等)的特权,确切地做和需要?在我的示例中,用户要能够访问REST,他/她需要以下角色:
<role-name>${app-role}</role-name>
<!-- we need this to amp internal privileges-->
<role-name>alert-user</role-name>
<role-name>alert-internal</role-name>
<role-name>rest-admin-internal</role-name> 然后我们开始讨论休息读者是一种特权还是一种角色?
因此,是一个更具体的问题:
访问roxy REST类型应用程序创建的rest端点所需的最小角色/权限集是什么?
发布于 2016-10-03 07:17:43
我建议在这里采取以下方法:
应用程序角色用于应用程序的执行,而不是内容访问。因此,从该角色中移除默认权限,只需授予它rest-reader/rest-writer特权,以及一些用于运行MLCP之类的特权。
接下来,确保REST扩展和其他没有由Roxy直接部署的内容获得读取和执行文档权限。想想用自定义代码、sql-视图或没有加载部署模式的模式创建的触发器和警报,我们在slush-this节点中使用的change_permissions函数可以作为如何处理这个问题的示例:https://github.com/marklogic/slush-marklogic-node/pull/298/files#diff-a529d1d70bd21866e1d12eda3a99f7b6R96。
一旦为需要单独授予访问权限的内容的每个部分创建了一个专用角色。如果您需要一组仅供一个用户访问的文档,则需要一个特定于用户的角色。如果您还拥有一组仅供项目成员访问的文档,则还需要一个特定于项目的角色。如果您也需要区分读/写,请为每个角色创建两个角色(两个用户,两个项目角色)。这些角色将没有特权,也不应该继承角色(除了写入继承相应的读取角色)。
一旦您拥有了读/写角色,您就可以开始考虑如何正确地将它们应用于文档权限。在这种复杂程度下,您可能希望避免默认权限,并显式地选择文档权限。xdmp: document -insert、MLCP和/v1/文档都具有显式的文档权限,因此您应该对这些文档拥有合理的控制。
加法
请注意Roxy的方框ml-config文件。对于REST类型的应用程序,它没有进行适当的调优。这就是为什么slush-marklogic-节点生成器修补ml-config:https://github.com/marklogic/slush-marklogic-node/blob/master/slushfile.js#L346的原因。
对REST的读取访问权限最低的是reader,而对REST的更新访问权限是。REST扩展是从模块数据库运行的,而不是从文件系统运行的,因此您还需要模块访问权限。上面提到的change_permissions函数为您修复了这个问题。
无论如何,我的一般建议是像前面提到的那样,使用app角色执行应用程序,并使用其他角色进行数据访问。任何想要使用该应用程序的用户都应该继承app角色,以及其他一些角色,以提供适当数量的数据访问。
哈哈!
https://stackoverflow.com/questions/39806582
复制相似问题