Spring Boot中的ElasticSearch凭证

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

我正在尝试将Spring boot elasticsearch与独立的ES远程服务器集成在一起,因此我已经在本地安装了ES,并且运行良好。

[我的问题现在,当在elasticsearch.yml文件中启用xpack.security.enabled: true(出于生产目的)时,我不知道如何正确添加用户名和密码。我已经尝试了多种方法,但是没有用。

我的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服务器不需要任何身份验证,则可以正常工作

spring spring-boot elasticsearch spring-data
1个回答
0
投票

假设您正在创建类似这样的elasticSearchOperation东西:

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();
    }
    }


    }
© www.soinside.com 2019 - 2024. All rights reserved.