搜索:搜索在查询控制台中返回结果但是当http从应用程序中点击时没有结果?

时间:2016-12-11 17:00:57

标签: xquery marklogic roxy

我这里有一个奇怪的情况。我正在尝试构建一个将http get请求发送到MarkLogic服务器的应用程序。它命中执行search:search("")的XQuery代码。我将空查询传递给搜索,以便返回默认的相关结果 我正在使用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  

是否有一项功能可以获得此用户角色下的所有默认权限 这是用于app server的用户,因为它更像是一个vanilla安装 用于查询控制台的用户是admin 我将命令xdmp:document-get-permissions()运行到其中一个加载文档,但它返回了空序列 xdmp:document-get-permissions("/a-ha+Take-on-Me.xml")
authentication-method = application-level

2 个答案:

答案 0 :(得分:3)

你说的很多,但你从未提及任何关于安全方面的事情:

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

为了快速跟踪这个帮助,我将回答假设非常香草安装的ML和Roxy:

  • 您可能使用查询控制台作为管理员。
  • 您可能正在使用
  • Roxy的部署员作为管理员。您可能正在使用其他用户 应用服务器。

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

最重要的是: 其中一份文件xdmp:document-get-permissions()

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

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

需要哪些角色? 好吧,您至少需要一个带有trights的用户(非管理员)才能使用您的应用程序以及对文档的读写权限。解释不止于此将做出太多假设。您需要了解安全模型并做出自己的选择。但作为一个例子,创建&#39; user1&#39;用密码和角色&#39; user1&#39;并且还可以通过Roxy为您的应用用户授予此角色的访问权限,并将身份验证设置为摘要。现在您拥有身份验证和可以将您的应用与密码一起使用的用户。更改上面的文档加载脚本,以便将加载的文档的读/写访问权限赋予user1角色。

现在你有一个应用程序:

  • 使用
  • 登录的用户
  • Auhentication
  • 加载的Doucments可由该用户读取(并已修改)。

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

还不足以解决问题?回答我上面提到的问题,人们可以提供更多帮助。

答案 1 :(得分:3)

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

当您使用现成的Roxy应用程序运行run()时,它会将文件上传到您的content-db,同时明确设置app-role的文档权限。它至少适用于读取和更新权限,也可以执行。

如果使用自定义代码覆盖内置部署内容,并且不使用roxy内部方法(如load_data),则必须自己应用这些权限。使用ml local deploy content可能不够好,因为默认情况下Roxy使用admin进行部署,并且通常没有定义默认权限,也不可能是他们对app-role的读取/更新权限你碰巧正在使用的应用程序。

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

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

HTH!