【问题标题】:Solr 4 with basic authentication具有基本身份验证的 Solr 4
【发布时间】:2013-03-03 21:08:12
【问题描述】:

我正在尝试使用 solrj 连接到 solr。我的 solr 实例在码头中运行,并受到基本身份验证的保护。我发现这些链接包含相关信息。

http://grokbase.com/t/lucene/solr-user/1288xjjbwx/http-basic-authentication-with-httpsolrserver

Preemptive Basic authentication with Apache HttpClient 4 但是,我仍然得到以下异常:

Caused by: org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:822)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:352)
... 5 more
 Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:625)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
... 8 more

我还附上了我正在使用的代码的 sn-p。

public static void main(String[] args) throws SolrServerException, IOException {

    HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/");

    DefaultHttpClient m_client =(DefaultHttpClient)server.getHttpClient(); 
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(USERNAME, PASSWORD);

    m_client.addRequestInterceptor(new PreemptiveAuthInterceptor(),0);
    (((DefaultHttpClient)m_client).getCredentialsProvider()).setCredentials(new AuthScope("localhost",8983), credentials);

    SolrInputDocument document = new SolrInputDocument();
    document.addField("id",123213);
    server.add(document);
    server.commit();

}

}

class PreemptiveAuthInterceptor implements HttpRequestInterceptor {

    public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
        AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);

        // If no auth scheme avaialble yet, try to initialize it
        // preemptively
        if (authState.getAuthScheme() == null) {
            AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth");
            CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
            HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
            if (authScheme != null) {
                Credentials creds = credsProvider.getCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort()));
                if (creds == null) {
                    throw new HttpException("No credentials for preemptive authentication");
                }
                authState.setAuthScheme(authScheme);
                authState.setCredentials(creds);
            }
        }

    }

谁能指出我正确的方向?谢谢!!

【问题讨论】:

标签: authentication solr jetty basic-authentication jetty-8


【解决方案1】:

您需要为 HttpClientUtil 添加 JAR solr-solrj-4.0.0.jar

然后使用下面的代码:

HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/"+url);     
HttpClientUtil.setBasicAuth((DefaultHttpClient) solrServer.getHttpClient(), "USERNAME", "PASSWORD");

这在 Jdk 1.6 和 tomcat 6 上对我有用

【讨论】:

    【解决方案2】:

    我在实施部分文档更新时遇到了同样的问题。我通过实现 PreemptiveAuthInterceptor 解决了这个问题。见下面代码

    PoolingClientConnectionManager cxMgr = new PoolingClientConnectionManager(
                            SchemeRegistryFactory.createDefault());
                    cxMgr.setMaxTotal(100);
                    cxMgr.setDefaultMaxPerRoute(20);
    
                    DefaultHttpClient httpclient = new DefaultHttpClient(cxMgr);
                    httpclient.addRequestInterceptor(
                            new PreemptiveAuthInterceptor(), 0);
                    httpclient.getCredentialsProvider().setCredentials(
                            AuthScope.ANY,
                            new UsernamePasswordCredentials(solrDto.getUsername(),
                                    solrDto.getPassword()));
    
                    HttpSolrServer solrServerInstance = new HttpSolrServer(solrDto.getUrl(),
                            httpclient);
                    solrServerInstance.setRequestWriter(new BinaryRequestWriter());
                    solrServerInstance.setAllowCompression(true);
    

    你还需要:

        private class PreemptiveAuthInterceptor implements HttpRequestInterceptor {
    
                public void process(final HttpRequest request, final HttpContext context)
                        throws HttpException, IOException {
                    AuthState authState = (AuthState) context
                            .getAttribute(ClientContext.TARGET_AUTH_STATE);
    
                    // If no auth scheme avaialble yet, try to initialize it
                    // preemptively
                    if (authState.getAuthScheme() == null) {
                        CredentialsProvider credsProvider = (CredentialsProvider) context
                                .getAttribute(ClientContext.CREDS_PROVIDER);
                        HttpHost targetHost = (HttpHost) context
                                .getAttribute(ExecutionContext.HTTP_TARGET_HOST);
                        Credentials creds = credsProvider.getCredentials(new AuthScope(
                                targetHost.getHostName(), targetHost.getPort()));
                        if (creds == null)
                            throw new HttpException(
                                    "No credentials for preemptive authentication");
                        authState.setAuthScheme(new BasicScheme());
                        authState.setCredentials(creds);
                    }
    
                }
    
            }
    

    【讨论】:

      【解决方案3】:

      根据 Solr Wiki 上的 Solr Security - SolrJ 部分,您应该能够执行以下操作:

       public static void main(String[] args) throws SolrServerException, IOException {
      
           HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/");
      
           HttpClientUtil.setBasicAuth(server.getHttpClient(), USERNAME, PASSWORD);
      
           SolrInputDocument document = new SolrInputDocument();
           document.addField("id",123213);
           server.add(document);
           server.commit();
      
       }
      

      【讨论】:

      • 谢谢佩奇。我仍然得到同样的例外。我认为原因是我们需要将 preemptiveauthentication 设置为 true。
      猜你喜欢
      • 2021-06-17
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2014-04-24
      • 2019-09-27
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多