1

我这里有一个奇怪的情况。我正在尝试构建一个将 http get 请求发送到 MarkLogic 服务器的应用程序。它命中了执行的 XQuery 代码search:search("")。我将空查询传递给搜索,因此返回默认的相关结果。
我正在使用 Roxy 进行部署。当我通过命令调用典型的 Roxy 部署函数时 -

ml local deploy content.  

它加载了所有文档,然后当我点击 localhost:7040 时,我得到了预期的结果。到目前为止,一切都很好。
现在,我重写 Roxy 的现有方法 deploy_content 并定义调用 XQuery 函数的新方法,该函数执行xdmp:document-load()将所有数据加载到内容数据库。这是代码片段 -

declare function loadTS:load($path) {
    let $result :=
        for $d in xdmp:filesystem-directory($path)//dir:entry
            let $log := xdmp:log(fn:concat("$d-->",xdmp:describe($d)))
            return xdmp:document-load($d//dir:pathname,
                <options xmlns="xdmp:document-load">
                    <uri>{fn:concat("/",$d//dir:filename)}</uri>
                    <permissions>{xdmp:default-permissions()}</permissions>
                    <format>xml</format>
                    <collections>
                        <collection>all</collection>
                    </collections>
                </options>)
     return $result
};

现在,当我点击应用程序时,我得到 0 结果,而相同的代码在查询控制台中运行良好。我认为这与角色和权限概念有关,因为当我从 roxy 向新创建的用户提供管理员角色时,我得到了预期的结果。我不想为稍后将使用我的应用程序的默认用户提供管理员角色。那么我需要在角色、权限和身份验证方面进行哪些修改才能解决我的问题?
注意:当我点击 localhost:7040 时,它不会要求进行身份验证。

ml.app-role:xyz-role  

是否有一个功能可以获取该用户角色下的所有默认权限。
这是用于应用服务器的用户,因为它更像是普通安装。
用于查询控制台的用户是 admin。
我将命令运行xdmp:document-get-permissions()到加载文档之一,但它返回空序列。
xdmp:document-get-permissions("/a-ha+Take-on-Me.xml").
身份验证方法=应用程序级别

4

2 回答 2

3

大卫提出了很好的观点,但我想我知道发生了什么......

当您ml local deploy content使用开箱即用的 Roxy 应用程序运行时,它会将文件上传到您的 content-db,同时明确设置应用程序角色的文档权限。它至少应用读取和更新权限,也可能执行。

如果您使用自定义代码覆盖内置部署内容,并且不使用像 load_data 这样的 Roxy 内部方法,您必须自己应用这些权限。使用xdmp:default-permissions()可能不够好,因为默认情况下 Roxy 使用管理员进行部署,并且通常没有定义默认权限,也不太可能是您碰巧应用的应用程序角色的读取/更新权限一起工作。

最优雅的出路是使用具有正确默认权限的特定于应用程序的上传用户。你必须自己配置它,然后以某种方式确保 Roxy 使用它。

一个更简单的方法是用显式调用替换xdmp:default-permissions()你的loadTS:load函数,要么是硬编码的,要么更好的地方是通过 加载,或者你从你的 custom 传递过来。xdmp:permissionxyz-role$app-name || "-role"$app-namesrc/app/config/config.xqy$app-namedeploy_content

于 2016-12-11T19:16:38.923 回答
3

你说了很多,但你从来没有提到任何关于安全方面的事情:

  • 与您一起部署的用户?
  • 该用户角色下列出的默认权限?
  • 用于应用服务器的用户?
  • 用于查询控制台的用户?
  • 附加到示例文档的实际权限?

为了快速跟踪此帮助,我将假设安装了非常普通的 ML 和 Roxy 来回答:

  • 您可能以管理员身份使用查询控制台。
  • 您可能正在使用
  • Roxy 的部署者作为管理员。您可能正在通过应用程序服务器使用另一个用户。

您上面的代码通过 Roxy 使用用户的默认权限。如果是管理员,则可能没有默认权限,因为管理员几乎绕过了所有安全性(包括甚至需要对文档的写入权限)。

最重要的是: 其中一个文档上的 xdmp:document-get-permissions()

回答以下问题:您的应用程序用户是否具有对文档的读取权限?如果没有,请调整上述方法以插入具有更适当权限的文档)。

不需要浪琴?这是因为您已将登录设置为应用程序级别,并且可能只使用 Roxy 的默认用户。需要认证吗?更改以在 Roxt xml 配置中消化和定义更多用户/角色。

需要什么角色?好吧,您至少需要一名用户(非管理员)有权使用您的应用程序并对您的文档进行读写访问。解释更多会做出太多假设。您需要了解安全模型并做出自己的选择。但作为示例,使用密码和角色“user1”创建“user1”,并根据 Roxy 定义为您的应用用户授予对角色的访问权限,并将身份验证设置为摘要。现在您有了身份验证和可以使用密码使用您的应用程序的用户。更改上面的文档加载脚本,将加载文档的读/写访问权限授予 user1 角色。

现在你有一个应用程序:

  • 用于登录的用户
  • 认证
  • 该用户可以阅读(和修改)的已加载文档。

这将为您提供绝对的基础知识。例如,它还没有准备好生产,因为您的默认用户(非登录应用程序用户)应该具有最低权限,其余的则转移到您的登录用户。

还不足以解决问题?回答我上面提到的问题,会有更多人需要帮助。

于 2016-12-11T17:41:19.260 回答