使用Solr 6.3.0
,在云模式下,3个外部zookeepers
作为集群,使用solrJ
作为客户端。
A:不使用身份验证
在启用authentication
之前,我使用以下代码添加/更新文档:
CloudSolrClient client = cloudClientBuilder.build();
UpdateResponse resp = client.add(doc, 5000);
client.commit();
client.close();
return resp;
它运行良好,新文档立即出现在搜索结果中。
B:启用身份验证
然后我启用了basic authentication plugin
和rule-based authorization plugin
(如果有必要的话,还启用了SSL
)。
为了设置credential信息,代码被重构如下:
// 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 -k --用户solr:密码“https://localhost:8983/solr/corexxx/update?wt=json&indent=true&commit=true“-d '[{“标识”:“20041”,“名称”:“xxx 41”,“位置”:“xxx”,“说明”:“xxx”}]'
已成功提交!并且,更新会立即显示在搜索结果中。
"我的猜测"
既然curl
工作得很好,我猜solr cloud本身也工作得很好。
因此,该问题是由B中基于SolrJ的代码引起的。
问题:
- 为什么代码B会出现
HTTP 401
错误?如何修复? - 我是否可以使用A中的代码,并且仍然能够提供凭据信息?如果可以,那么如何提供?
- 谢谢-谢谢
2条答案
按热度按时间lqfhib0f1#
您应该将
client.commit()
更改为req.commit(client, ConfigUtil.getProp(ConfigUtil.KEY_SOLR_CORE))
,凭据在UpdateRequest中设置。ryevplcw2#
它是这样工作的: