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 协议,那么社区客户有:
- Jest which supports HTTP authentication
- Elasticsearch HTTP 很新
但是这些解决方案与 Spring 数据不兼容
如果您使用的是 ElasticSearch 的 Docker 图片,它会附带 X-Pack:
- Elastic.co: Install ElasticSearch with Docker
- Elastic.co: Getting started with security
- Elastic.co: Java Client and Security
- Elastic.co: Configuring X-Pack Java Clients
以上链接指的是 5.5 版本,因为这是 Spring Data ElasticSearch 在我回答时支持的版本。
总结这些链接,以下是您必须遵循的步骤:
在您的项目中包含 org.elasticsearch.client:x-pack-transport
依赖项。您可能需要在构建的存储库部分添加此存储库。gradle/pom.xml: https://artifacts.elastic.co/maven 如下所示:
存储库{
行家{
url “https://artifacts.elastic.co/maven”
}
}
使用 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 连接以确保密码不会以明文形式通过网络发送。
我想访问一个受用户名和密码保护的远程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 协议,那么社区客户有:
- Jest which supports HTTP authentication
- Elasticsearch HTTP 很新
但是这些解决方案与 Spring 数据不兼容
如果您使用的是 ElasticSearch 的 Docker 图片,它会附带 X-Pack:
- Elastic.co: Install ElasticSearch with Docker
- Elastic.co: Getting started with security
- Elastic.co: Java Client and Security
- Elastic.co: Configuring X-Pack Java Clients
以上链接指的是 5.5 版本,因为这是 Spring Data ElasticSearch 在我回答时支持的版本。 总结这些链接,以下是您必须遵循的步骤:
在您的项目中包含
org.elasticsearch.client:x-pack-transport
依赖项。您可能需要在构建的存储库部分添加此存储库。gradle/pom.xml: https://artifacts.elastic.co/maven 如下所示:存储库{ 行家{ url “https://artifacts.elastic.co/maven” } }
使用 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 连接以确保密码不会以明文形式通过网络发送。