Spring boot подключается к Elasticsearch с базовой аутентификацией
Обзор:
Я пробовал небезопасную связь между API и моим локальным поиском и все работало хорошо. Чтобы обеспечить безопасность соединения, я сделал следующие шаги, чтобы добавить плагин xpack на свой эластик и использовал его в API:
- Из упругой части я установил xpack на основе Install xpack, и все хорошо за пределами Api. Затем добавил имя пользователя api с паролем apipass в качестве нового эластичного суперпользователя.
- Со стороны API я обновил код для безопасного соединения следующим образом: Клиент Java и Безопасность
Мой код изменяется в эластичных конфигурациях:
@Bean
public TransportClient transportClient() throws UnknownHostException {
Settings settings = Settings.builder()
.put("cluster.name", clusterName)
.put("xpack.security.user", "api:apipass")
.build();
try (TransportClient client = new PreBuiltXPackTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName(host), tcpPort))) {
String token = basicAuthHeaderValue("api", new SecureString("apipass".toCharArray()));
client.filterWithHeader(Collections.singletonMap("Authorization", token))
.prepareSearch().get();
return client;
}
}
Выпуск:
При попытке запустить эластичный запрос через приложение будет создано следующее исключение:
Caused by: java.lang.IllegalStateException: transport client is closed
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:243) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:357) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:405) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:394) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:46) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.action.ActionRequestBuilder.get(ActionRequestBuilder.java:53) ~[elasticsearch-6.0.0.jar:6.0.0]
Я был бы признателен, если бы кто-нибудь мог поделиться со мной своим подлинным решением по подключению загрузочного приложения Spring к asticsearch с базовой аутентификацией?
1 ответ
Если вы используете <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
зависимости вам необходимо указать имя пользователя и пароль с помощью базовой аутентификации.
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@Configuration
@EnableElasticsearchRepositories(basePackages = "yourpackage.domain.elastic")
public class ElasticConfig {
@Value("${elasticsearch.host}")
private String host;
@Value("${elasticsearch.username}")
private String username;
@Value("${elasticsearch.password}")
private String password;
@Bean
public RestHighLevelClient client() {
ClientConfiguration clientConfiguration
= ClientConfiguration.builder()
.connectedTo(host)
.withBasicAuth(username, password) // put your credentials
.build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchRestTemplate(client());
}
}
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("username", "password"));
final RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
final RestClient restClient = builder.build();
final Response result = restClient.performRequest("GET", "_index/blahblah",
Collections.emptyMap());
@saeedj: я подписался на https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.x/_basic_authentication.html
Можешь попробовать:)
Удалите транспортного клиента из Try-with-resources, клиент будет закрыт, когда вы оставите "попробовать". У вас может быть ошибка от Sonar или аналогичного обозревателя кода. Это было решение, которое я нашел.