Authentication Solr6.3.0用于基本身份验证的SolrJ API
我正在尝试使用以下代码使用SolrJ API连接SolrCloud:Authentication Solr6.3.0用于基本身份验证的SolrJ API,authentication,solr,basic-authentication,solrj,Authentication,Solr,Basic Authentication,Solrj,我正在尝试使用以下代码使用SolrJ API连接SolrCloud: String zkHostString = "localhost:9983"; String USER = "solr"; String PASSWORD = "SolrRocks"; CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentia
String zkHostString = "localhost:9983";
String USER = "solr";
String PASSWORD = "SolrRocks";
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(USER, PASSWORD));
CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
CloudSolrClient solr = new CloudSolrClient.Builder().withZkHost(zkHostString).withHttpClient(httpClient).build();
((CloudSolrClient)solr).setDefaultCollection("gettingstarted");
但得到的错误如下:
线程“main”org.apache.solr.client.solrj.impl.CloudSolrClient$RouteException中出现异常:在以下位置与服务器对话时发生IOException:
位于org.apache.solr.client.solrj.impl.CloudSolrClient.directUpdate(CloudSolrClient.java:767)
位于org.apache.solr.client.solrj.impl.CloudSolrClient.sendRequest(CloudSolrClient.java:1173)
位于org.apache.solr.client.solrj.impl.CloudSolrClient.requestWithRetryOnStaleState(CloudSolrClient.java:1062)
位于org.apache.solr.client.solrj.impl.CloudSolrClient.request(CloudSolrClient.java:1004)
位于org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:149)
位于org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:173)
位于org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:190)
位于com.app.graphiti.TextParser.main(TextParser.java:92)
原因:org.apache.solr.client.solrj.SolrServerException:IOException在以下位置与服务器对话时发生:
位于org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:607)
位于org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:262)
位于org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:251)
位于org.apache.solr.client.solrj.impl.LBHttpSolrClient.doRequest(LBHttpSolrClient.java:435)
位于org.apache.solr.client.solrj.impl.LBHttpSolrClient.request(LBHttpSolrClient.java:387)
位于org.apache.solr.client.solrj.impl.CloudSolrClient.lambda$directUpdate$0(CloudSolrClient.java:742)
位于java.util.concurrent.FutureTask.run(未知源)
位于org.apache.solr.common.util.execututil$MDCAwareThreadPoolExecutor.lambda$execute$0(execututil.java:229)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
位于java.lang.Thread.run(未知源)
原因:org.apache.http.client.ClientProtocolException
位于org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
在org.apache.http.impl.client.CloseableHttpClient.execute上(CloseableHttpClient.java:82)
在org.apache.http.impl.client.CloseableHttpClient.execute上(CloseableHttpClient.java:55)
位于org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:498)
... 10多
原因:org.apache.http.client.NonRepeatableRequestException:无法使用不可重复的请求实体重试请求。
位于org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:225)
位于org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
位于org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
位于org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
位于org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
... 还有13个
16:55:40.289[主发送线程(0:0:0:0:0:0:0:1:9983)]调试org.apache.zookeeper.ClientCnxn-在1ms后获得会话ID:0x15a3bc76e1f000e的ping响应
16:55:43.624[主发送线程(0:0:0:0:0:0:0:1:9983)]调试org.apache.zookeeper.ClientCnxn-在1ms后获得会话ID:0x15a3bc76e1f000e的ping响应
16:55:46.958[主发送线程(0:0:0:0:0:0:0:1:9983)]调试org.apache.zookeeper.ClientCnxn-在1ms后获得会话ID:0x15a3bc76e1f000e的ping响应
\
请帮忙。
Vrinda Davda我相信这里发生的事情是SolrJ使用POST添加您的文档,而不是进行抢占式身份验证。这过去比较容易,但现在似乎需要使用
HttpClientBuilder
来提供CredentialsProvider
和HttpRequestInterceptor
,以便在必要时,使用新的基本方案
和用户名密码凭据
更新请求上下文的目标身份验证状态
我花了一天的大部分时间来和这件事斗争,直到我发现
2015年3月12日的帖子:
这对我来说适用于Solr 6.4.1服务器和SolrJ 5.3.1客户端。我找到了一种稍微简单一点的方法 您可以像这样添加一个请求拦截器,这样您就不必担心自己创建一个正确配置的HttpClient实例。这只会将拦截器添加到Solrj创建的默认HttpClient中
org.apache.solr.client.solrj.impl.HttpClientUtil.addRequestInterceptor(new SolrPreemptiveAuthInterceptor());
RequestInterceptor如下所示:
public class SolrPreemptiveAuthInterceptor implements HttpRequestInterceptor {
final static Logger log = LoggerFactory.getLogger(SolrPreemptiveAuthInterceptor.class);
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
AuthState authState = (AuthState) context.getAttribute(HttpClientContext.TARGET_AUTH_STATE);
// If no auth scheme available yet, try to initialize it preemptively
if (authState.getAuthScheme() == null) {
log.info("No AuthState: set Basic Auth");
HttpHost targetHost = (HttpHost) context.getAttribute(HttpCoreContext.HTTP_TARGET_HOST);
AuthScope authScope = new AuthScope(targetHost.getHostName(), targetHost.getPort());
CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(HttpClientContext.CREDS_PROVIDER);
Credentials creds = credsProvider.getCredentials(authScope);
if(creds == null){
log.info("No Basic Auth credentials: add them");
creds = getCredentials(authScope);
}
authState.update(new BasicScheme(), creds);
}
}
private Credentials getCredentials(AuthScope authScope) {
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(user, password);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(authScope, creds);
log.info("Creating Basic Auth credentials for user {}", user);
return credsProvider.getCredentials(authScope);
}
}
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, password);
provider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).build();
solrClient = new HttpSolrClient.Builder().withBaseSolrUrl(endpoint).withHttpClient(client).build();