簡體   English   中英

如何通過 Java 高級 Rest 客戶端訪問安全彈性搜索

[英]How to hit Secure Elastic Search through Java High Level Rest Client

我是彈性搜索的新手。 通過Java High Level Rest Client將我的 Spring 引導應用程序與彈性搜索集成。

我已經如下配置了 JHLRC bean,它工作正常:

@Bean(destroyMethod = "close")
public RestHighLevelClient client() {
  RestHighLevelClient client = new RestHighLevelClient(
      RestClient.builder(new HttpHost("localhost", 9200, "http")));
  return client;
}

開始探索 Elasticsearch 的安全性,設置證書和密碼后,我通過提供以下屬性啟用了安全性:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

我可以使用創建的用戶名和密碼登錄 kibana,但在通過 JHLRC 訪問任何彈性搜索 API 時會出現 401 Unauthorized。

有人可以幫我解決在配置Java High Level Rest Client以訪問安全彈性搜索時需要做的進一步更改嗎?

您需要包括在訪問 kibana 時提供的基本憑據,下面的代碼顯示您可以在 JHLRC 中傳遞用戶名和密碼。

首先,從您的用戶名和密碼創建編碼字符串,您可以使用以下代碼使用具有所有訪問權限的超級用戶elastic

private String getEncodedString(String username, String password) {
        return HEADER_PREFIX + Base64.getEncoder().encodeToString(
                (username + ":" + password)
                        .getBytes());
    }

現在在您的請求選項中,您傳遞 auth header,其中將包含您將從上述方法獲得的 base 64 編碼字符串。

RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder()
                .addHeader(AUTH_HEADER_NAME, getEncodedString(basicCredentials));

最后,您只需要構建上述請求選項構建器的 object 並在任何請求中將其傳遞給您的客戶端,如下所示:

GetResponse getResponse = restHighLevelClient.get(getRequest, builder.build());

在 JHLRC 中進行以下更改后,它起作用了:

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

    final BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider();
    basicCredentialsProvider
        .setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "password_generated_by_elastic_search"));

    RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http"))
            .setHttpClientConfigCallback(new HttpClientConfigCallback() {
              @Override
              public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                httpClientBuilder.disableAuthCaching();
                return httpClientBuilder.setDefaultCredentialsProvider(basicCredentialsProvider);
              }
            })

    );

    return restHighLevelClient;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM