Elasticsearch Java RestHighLevelClient没有在每个搜索请求中发送授权。

问题描述 投票:0回答:1

我们有Elasticsearch 7.0.1和Spring Boot 1.5,并使用了 RestHighLevelClient 来设置SSL证书和基本认证为这样的。

@Bean(destroyMethod = "close")
    public RestHighLevelClient initRestHighLevelClient() {

        RestClientBuilder builder = null;

        if (this.scheme.equalsIgnoreCase("http")) {

            builder = RestClient.builder(new HttpHost(hostName, port, scheme));

        } else {

            try {

                KeyStore truststore = KeyStore.getInstance("jks");
                //TODO if it won't always be on classpath we should use Files.newInputStream(Paths.get(...))
                try (InputStream is = new ClassPathResource("dev.jks").getInputStream()) {
                    truststore.load(is, storePass.toCharArray());
                }
                SSLContextBuilder sslBuilder = SSLContexts.custom()
                        .loadTrustMaterial(truststore, null);
                final SSLContext sslContext = sslBuilder.build();

                final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
                credentialsProvider.setCredentials(AuthScope.ANY,
                        new UsernamePasswordCredentials(user, pass));

                builder = RestClient.builder(
                        new HttpHost(hostName, port, scheme))
                        .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                            @Override
                            public HttpAsyncClientBuilder customizeHttpClient(
                                    HttpAsyncClientBuilder httpClientBuilder) {
                                return httpClientBuilder
                                        .setDefaultCredentialsProvider(credentialsProvider)
                                        .setSSLContext(sslContext);
                            }
                        });

            } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | KeyManagementException e) {
                System.out.println("Unable to initialize elasticsearch connection, shutting down");
            }
        }

        final RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }

然后我们使用 SearchSourceBuilder 来创建我们的查询并执行为。

restHighLevelClient.search(new SearchRequest(indexName).source(searchSourceBuilder), RequestOptions.DEFAULT);

问题是,授权头,

Authorization Basic TOKEN);

并不是每个请求都会被传递,我们必须这样做。

RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        builder.addHeader("Authorization", "Basic " + "BASE64_ENCODED_TOKEN");

        return restHighLevelClient.search(new SearchRequest(indexName).source(searchSourceBuilder),builder.build());

这样就能成功了

我们缺少了什么?配置不是应该已经为我们做了这些吗?

参考文献。https:/www.elastic.coguideenelastic-stack-overviewcurrenthttp-clients.htmlhttps:/www.elastic.coguideenelasticsearchclientjava-restmasterjava-rest-low-usage-requests.html#java-rest-low-usage-request-optionshttps:/www.elastic.coguideenelasticsearchclientjava-restcurrent_basic_authentication.html

谢谢你,谢谢你

java spring authentication elasticsearch authorization
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.