SpringBoot 操作 ElasticSearch 时 RESTful Api Basic 认证

概述

Elasticsearch 7.9.0 开启了用户名密码校验,需要用户名密码登入。并且设置的user、role等权限。需要使用认证的方式进行访问。

application.yml 配置

# Elasticsearch
es:
  schema: http # 协议
  address: 192.168.6.89:9200 # IP:端口号
  username: esuser #用户名
  password: changeme #密码
  connect-timeout: 5000 # 连接超时
  socket-timeout: 10000 # socket 连接超时时间
  connection-request-timeout: 5000 # 连接请求超时
  max-connect-num: 100 # 最大连接数
  max-connect-per-route: 100 # 最大路由连接数

pom.xml 依赖

<!-- ElasticSearch 高级客户端 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

ElasticSearchConfig 配置类

package com.demo.config;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
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 java.util.ArrayList;
import java.util.List;

/**
 * 搜索引擎配置类
 *
 * @author lee
 * @date 2022/5/31 15:40
 */
@Configuration
public class ElasticSearchConfig {

    /**
     * 集群地址,如果有多个,用"," 隔开
     */
    @Value("${es.address}")
    private String address;

    /**
     * 协议
     */
    @Value("${es.schema}")
    private String schema;

    /**
     * 用户名
     */
    @Value("${es.username}")
    private String userName;

    /**
     * 密码
     */
    @Value("${es.password}")
    private String password;

    /**
     * 连接超时时间
     */
    @Value("${es.connect-timeout}")
    private int connectTimeout;

    /**
     * Socket 连接超时时间
     */
    @Value("${es.socket-timeout}")
    private int socketTimeout;

    /**
     * 获取连接的超时时间
     */
    @Value("${es.connection-request-timeout}")
    private int connectionRequestTimeout;


    /**
     * 最大路连接数
     */
    @Value("${es.max-connect-num}")
    private int maxConnectNum;

    /**
     * 最大路由连接数
     */
    @Value("${es.max-connect-per-route}")
    private int maxConnectPerRoute;


    @Bean
    public RestHighLevelClient restHighLevelClient() {
        String auth = Base64.encodeBase64String((userName + ":" + password).getBytes());

        // 拆分地址
        List<HttpHost> hostLists = new ArrayList<>();
        String[] hostList = address.split(",");
        for (String addr : hostList) {
            String host = addr.split(":")[0];
            String port = addr.split(":")[1];
            hostLists.add(new HttpHost(host, Integer.parseInt(port), schema));
        }

        // 转换成 HttpHost数据
        HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{});

        // 设置用户名和密码
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
        RestClientBuilder builder = RestClient.builder(httpHost)
                .setHttpClientConfigCallback(httpClientBuilder -> {
                    httpClientBuilder.disableAuthCaching();
                    return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                });

        // 异步连接延迟
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeout);
            requestConfigBuilder.setSocketTimeout(socketTimeout);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
            return requestConfigBuilder;
        });

        // 设置 header
        builder.setDefaultHeaders(new BasicHeader[]{
                new BasicHeader("Authorization", "Basic" + auth)
        });

        return new RestHighLevelClient(builder);
    }

可能出现异常

{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "missing authentication credentials for REST request [/demo/_search]",
        "header": {
          "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
        }
      }
    ],
    "type": "security_exception",
    "reason": "missing authentication credentials for REST request [/demo/_search]",
    "header": {
      "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
    }
  },
  "status": 401
}

解决方案

尝试删除代码

        // 设置 header
        builder.setDefaultHeaders(new BasicHeader[]{
                new BasicHeader("Authorization", "Basic" + auth)
        });

参考链接

【简书】解决ElasticSearch Java High RESTful Api Basic认证的问题

ps:如有错误,欢迎批评指正,谢谢!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Spring Boot集成Elasticsearch Java API Client,你可以按照以下步骤进行操作: 1. 首先,你需要在你的项目中添加Elasticsearch的依赖。可以在官方文档()中找到相关的依赖信息。 2. 接下来,你可以通过创建低级别的RestClient来连接到Elasticsearch。你可以使用以下代码片段来创建一个基于RestClient的传输对象: ```java RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build(); ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper()); ElasticsearchClient client = new ElasticsearchClient(transport); ``` 3. 一旦你建立了与Elasticsearch的连接,你就可以使用ElasticsearchClient来执行各种操作。比如,你可以使用以下代码来创建一个索引: ```java CreateIndexResponse createIndexResponse = client.indices().create(c -> c.index("newapi")); ``` 在这个例子中,"newapi"是你要创建的索引的名称。 所以,以上是使用Spring Boot集成Elasticsearch Java API Client的基本步骤。你可以根据你的具体需求进一步使用ElasticsearchAPI来完成其他操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [springboo整合elasticSearch8 java client api](https://blog.csdn.net/A434534658/article/details/125239480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leeindex

感谢您的鼓励~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值