Учетные данные ElasticSearch при загрузке Spring - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь интегрировать Spring bootasticsearch с автономным удаленным сервером ES, поэтому я установил ES локально, и он работает нормально.

Моя проблема сейчас, когда включается xpack.security.enabled: true в файлеasticsearch.yml(Для производственных целей), я не знаю, как правильно добавить имя пользователя и пароль. Я пробовал несколько способов, но безуспешно.

мой файл pom.xml

<dependencies>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client-sniffer</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

мой файл application.properties

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300

все работает нормально, если сервер ESне требует аутентификации

1 Ответ

1 голос
/ 03 октября 2019

Предполагается, что вы создаете что-то подобноеasticSearchOperation:

public ElasticsearchOperations elasticsearchTemplate(final JestClient jestClient,
                                                         final ElasticsearchConverter elasticsearchConverter,
                                                         final SimpleElasticsearchMappingContext simpleElasticsearchMappingContext,
                                                         EntityMapper mapper) {
        return new JestElasticsearchTemplate(
            jestClient,
            elasticsearchConverter,
            new DefaultJestResultsMapper(simpleElasticsearchMappingContext, mapper));
    }

вам необходимо настроить учетные данные в JestClient, которые вы можете сделать следующим образом:

JestHttpClient build() {
  JestClientFactory factory = new JestClientFactory();
  Builder builder =
      new HttpClientConfig.Builder(cfg.urls)
          .multiThreaded(true)
          .discoveryEnabled(false)
          .connTimeout((int) cfg.connectionTimeout)
          .maxConnectionIdleTime(cfg.maxConnectionIdleTime, cfg.maxConnectionIdleUnit)
          .maxTotalConnection(cfg.maxTotalConnection)
          .readTimeout(cfg.readTimeout)
          .requestCompressionEnabled(cfg.requestCompression)
          .discoveryFrequency(1L, TimeUnit.MINUTES);

  if (cfg.username != null && cfg.password != null) {
    builder.defaultCredentials(cfg.username, cfg.password);
  }

  factory.setHttpClientConfig(builder.build());
  return (JestHttpClient) factory.getObject();
}

Обратите внимание, что сваш сервер удаленный, вы хотите создать HttpClientConfig ..

РЕДАКТИРОВАТЬ: Попробуйте что-то вроде этого .... не проверял себя, то есть не работает / тестировал код, но вы можете получить идею

package com.asimplemodule.config;

    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.github.vanroy.springdata.jest.JestElasticsearchTemplate;
    import com.github.vanroy.springdata.jest.mapper.DefaultJestResultsMapper;
    import io.searchbox.client.JestClient;
    import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
    import org.springframework.data.elasticsearch.core.EntityMapper;
    import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
    import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;

    import java.io.IOException;

    @Configuration
    @EnableConfigurationProperties(ElasticsearchProperties.class)
    public class ElasticsearchConfiguration {

        private ObjectMapper mapper;

        public ElasticsearchConfiguration(ObjectMapper mapper) {
            this.mapper = mapper;
        }

        @Bean
        public EntityMapper getEntityMapper() {
            return new CustomEntityMapper(mapper);
        }

        @Bean
        @Primary
        public ElasticsearchOperations elasticsearchTemplate(                                                      final ElasticsearchConverter elasticsearchConverter,
                                                             final SimpleElasticsearchMappingContext simpleElasticsearchMappingContext,
                                                             EntityMapper mapper) {
final JestClient jestClient = createJestClient();
            return new JestElasticsearchTemplate(
                jestClient,
                elasticsearchConverter,
                new DefaultJestResultsMapper(simpleElasticsearchMappingContext, mapper));
        }

        public class CustomEntityMapper implements EntityMapper {

            private ObjectMapper objectMapper;

            public CustomEntityMapper(ObjectMapper objectMapper) {
                this.objectMapper = objectMapper;
                objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
                objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, true);
                objectMapper.configure(SerializationFeature.INDENT_OUTPUT, false);
                objectMapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, true);
            }

            @Override
            public String mapToString(Object object) throws IOException {
                return objectMapper.writeValueAsString(object);
            }

            @Override
            public <T> T mapToObject(String source, Class<T> clazz) throws IOException {
                return objectMapper.readValue(source, clazz);
            }
        }
    @Bean
    public JestClient createJestClient(){
    JestHttpClient build() {
      JestClientFactory factory = new JestClientFactory();
      Builder builder =
          new HttpClientConfig.Builder(cfg.urls)
              .multiThreaded(true)
              .discoveryEnabled(false)
              .connTimeout((int) cfg.connectionTimeout)
              .maxConnectionIdleTime(cfg.maxConnectionIdleTime, cfg.maxConnectionIdleUnit)
              .maxTotalConnection(cfg.maxTotalConnection)
              .readTimeout(cfg.readTimeout)
              .requestCompressionEnabled(cfg.requestCompression)
              .discoveryFrequency(1L, TimeUnit.MINUTES);

      if (cfg.username != null && cfg.password != null) {
        builder.defaultCredentials(cfg.username, cfg.password);
      }

      factory.setHttpClientConfig(builder.build());
      return (JestHttpClient) factory.getObject();
    }
    }


    }

Попробуйте добавить этот bean-компонент конфигурации, чтобы он использовал JestClient с вашими учетными данными. Вы должны поставить свои собственные значения для того, где мой cfg.wh независимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...