Spring 中的 Elasticsearch HTTP 身份验证

Elasticsearch HTTP authentication in Spring

我想访问一个受用户名和密码保护的远程elasticsearch。 https://[username]:[password]@aws-eu-west-1-portal1.dblayer.com:11109/

在 Spring 中,使用 XML 配置,我能够访问我的 localhost elastic,如下所示

<!-- ElasticSearch -->
<elasticsearch:repositories base-package="be.smartsearch.service.repository.elasticsearch" />

<elasticsearch:transport-client id="esClient" cluster-nodes="localhost:9300" />

<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
  <constructor-arg name="client" ref="esClient" />
</bean>

到目前为止,我找到的唯一有用的文档是 PHP:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_security.html

如何使用 XML 配置的 Spring 数据中的凭据连接到远程 elasticsearch?

更新 1

在Mongo中我可以通过以下方法做到

<!-- Mongo -->
<mongo:mongo host="${mongo.host}" port="${mongo.port}"/>

<mongo:db-factory dbname="SmartSearchAfterDemo" mongo-ref="mongo" username="${mongo.user}" password="${mongo.password}"/>
<!--<mongo:db-factory dbname="${mongo.dbname}" mongo-ref="mongo"/> -->

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>

<mongo:repositories base-package="be.smartsearch.service.repository.mongo"/>

Spring 数据 Elasticsearch 基于官方 Elasticsearch Java 客户端,它使用二进制传输协议(不是像 PHP 这样的 REST HTTP 协议)。

如果您使用 Shield 来保护 Elasticsearch,那么您可以在传输 client/Transport 协议上设置 user/password

TransportClient client = TransportClient.builder()
    .addPlugin(ShieldPlugin.class)
    .settings(Settings.builder()
        .put("cluster.name", "yourcluster")
        .put("shield.user", "youruser:yourpassword")
        ...
        .build())

如果您不想使用来自 Java 代码的 HTTP 协议,那么社区客户有:

但是这些解决方案与 Spring 数据不兼容

如果您使用的是 ElasticSearch 的 Docker 图片,它会附带 X-Pack:

以上链接指的是 5.5 版本,因为这是 Spring Data ElasticSearch 在我回答时支持的版本。 总结这些链接,以下是您必须遵循的步骤:

  1. 在您的项目中包含 org.elasticsearch.client:x-pack-transport 依赖项。您可能需要在构建的存储库部分添加此存储库。gradle/pom.xml: https://artifacts.elastic.co/maven 如下所示:

    存储库{ 行家{ url “https://artifacts.elastic.co/maven” } }

  2. 使用 X-Pack:

    将您的传输客户端替换为一个
    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
    ...
    TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
        .put("cluster.name", "myClusterName")
        .put("xpack.security.user", "transport_client_user:changeme")
        ...
        .build())
    .addTransportAddress(new InetSocketTransportAddress("localhost", 9300))
    .addTransportAddress(new InetSocketTransportAddress("localhost", 9301));
    

重要提示:除了上述 HTTP 身份验证步骤外,您还应该设置 HTTPS 连接以确保密码不会以明文形式通过网络发送。