【问题标题】:search:search returns results in query console but no results when its hit from an application by http get?搜索:搜索在查询控制台中返回结果,但在 http get 从应用程序中命中时没有结果?
【发布时间】:2017-04-26 14:26:38
【问题描述】:

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

ml local deploy content.  

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

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")
身份验证方法=应用程序级别

【问题讨论】:

    标签: xquery marklogic roxy


    【解决方案1】:

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

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

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

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

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

    要看的大事是: xdmp:document-get-permissions() 在其中一份文件上。

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

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

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

    现在你有一个应用:

    • 用于登录的用户
    • 身份验证
    • 加载的文档可供该用户阅读(和修改)。

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

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

    【讨论】:

    • ml.app-role:xyz-role 有没有获取该用户角色下所有默认权限的功能。这是用于应用服务器的用户,因为它更像是普通安装。用于查询控制台的用户是 admin。我将命令 xdmp:document-get-permissions() 运行到加载文档之一,但它返回空序列。 xdmp:document-get-permissions("/a-ha+Take-on-Me.xml")。身份验证方法=应用程序级别
    • 如果你得到一个空的 document-get-permissions 序列,那么插入它们的用户是管理员用户(唯一被允许插入文档而没有至少一个更新权限的用户).. . 这里的问题不是 xyz 用户的默认权限(因为没有 - 这也将是该用户插入文档时的问题)。问题是您正在使用管理员用户插入文档,而不是授予 xyz 用户读取(和更新?)权限。
    【解决方案2】:

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

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

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

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

    一个更简单的方法是用显式的xdmp:permission 调用替换loadTS:load 函数中的xdmp:default-permissions(),对于硬编码的xyz-role,或者更好的$app-name || "-role",其中$app-name 将通过src/app/config/config.xqy 加载,或者您通过自定义deploy_content 传递$app-name

    HTH!

    【讨论】:

    • 根本问题是:了解安全模型。
    • 好的。这行得通,将 xdmp:default-permissions() 替换为 {xdmp:permission("xyz-role", "read")}。是的,我必须了解 marklogic 的安全模型。也许,这不是最好的方法,但一次就奏效了。
    • 了解 MarkLogic 安全性以及了解 Roxy 如何使用它。小步骤会让你完全理解..
    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2012-02-27
    • 2014-11-25
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多