SolrJ - 启用身份验证插件时无法提交更新

时间:2017-02-05 18:34:15

标签: solr lucene solrj solrcloud

使用Solr 6.3.0,在云模式下,将3个外部zookeepers作为群集,并使用solrJ作为客户端。

答:没有身份验证

在启用authentication之前,我使用以下代码添加/更新文档:

    CloudSolrClient client = cloudClientBuilder.build();
    UpdateResponse resp = client.add(doc, 5000);
    client.commit();
    client.close();
    return resp;

效果很好,新文档立即搜索结果。

B:启用身份验证

然后我启用了basic authentication pluginrule-based authorization plugin(以及SSL,如果这很重要的话。)

要设置凭据信息,代码将重构如下:

    // create request,
    UpdateRequest req = new UpdateRequest();

    // add doc to request,
    req.add(doc, 5000);

    // set credential,
    req.setBasicAuthCredentials(user, password);

    // create client,
    CloudSolrClient client = cloudClientBuilder.build();
    client.setDefaultCollection(ConfigUtil.getProp(ConfigUtil.KEY_SOLR_CORE));
    // do request & get response,
    UpdateResponse resp = req.process(client);

    client.commit();
    client.close();

然后它会得到类似的错误:

  

错误401需要身份验证,需要身份验证。

调试时,错误发生在第client.commit();行。

尝试使用curl

我使用curl进行更新:

  

curl -k --user solr:password“https://localhost:8983/solr/corexxx/update?wt=json&indent=true&commit=true” - d'[{“id”:“20041”,“name”:“xxx 41”,“location”:“xxx”,“描述 “:” XXX“}]'

它成功了!并且,更新在搜索结果中立即可见。

我的猜测

由于curl效果很好,我猜solr cloud本身运行正常。

因此问题是由 B 的代码引起的,该代码基于SolrJ。

问题:

  • 为什么代码 B 会出现HTTP 401错误?我该如何解决?
  • 我可以使用 A 中的代码,并且仍然能够提供凭据信息,如果是,那么如何?

感谢。

2 个答案:

答案 0 :(得分:2)

您应该更改client.commit()的{​​{1}},凭据在UpdateRequest中设置。

答案 1 :(得分:0)

它的工作原理如下:

        SolrClient client = new HttpSolrClient.Builder(urlString).build();
        UpdateRequest up = new UpdateRequest();
        up.setBasicAuthCredentials(user, pass);
        up.add(doc1);
        up.process(client, core);
        up.commit(client, core);
        client.close();