Ruby 在 Rails 上:ElasticSearch 身份验证(轮胎和 ElasticSearch-rails)

Ruby On Rails: ElasticSearch authentication (Tire and ElasticSearch-rails)

我在 Heroku 上部署了一个 Ruby On Rails 应用程序,我正在使用 ElasticSearch 附加组件,我的弹性搜索集群工作正常,但最近 ElasticSearch 附加组件要求所有集群强制执行身份验证以保护托管集群内部的数据,现在我们尝试发出的每个请求都会收到以下异常:

Tire::Search::SearchRequestFailed (401 : {"error":{"root_cause":[{"type":"security_exception","reason":"action [indices:data/read/search] requires authentication","header":{"WWW-Authenticate":"Basic realm=\"shield\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"action [indices:data/read/search] requires authentication","header":{"WWW-Authenticate":"Basic realm=\"shield\" charset=\"UTF-8\""}},"status":401}):

我们通过 Elasticsearch 附带的 Shield 插件配置了一些用户,但是我不确定如何从我的 ruby 在 Rails 应用程序中输入此身份验证,我使用的是 Tire将弹性搜索集成到我的 Ruby On Rails 应用程序中,但我找不到是否可以放置此信息以验证我的应用程序并解决此问题。

我们想知道如何使用这两个 gem 进行身份验证: ElasticSearch-rails and Tire

推荐使用elasticsearch-rails代替tire(已弃)

使用elasticsearch-rails:

gemfile

gem 'elasticsearch'
gem 'elasticsearch-model'
gem 'elasticsearch-rails'

模型是否可搜索

feature extraction pattern(可搜索的问题)应用于您的模型。

配置您的弹性搜索客户端

对于初始化器(config/initializers/elastic_search_client.rb 或其他)中的所有模型,使用通用 URL 格式进行身份验证

Elasticsearch::Client.new url: 'https://username:password@api.server.org:4430/search'

或使用散列进行身份验证

Elasticsearch::Client.new hosts: [
  { host: 'my-protected-host',
    port: '443',
    user: 'USERNAME',
    password: 'PASSWORD',
    scheme: 'https'
  } ]

查看 advanced client options 了解更多信息。

注:我没有亲测,理论是这样的,可能有什么遗漏,查看elasticsearch-rails docs.

希望对您有所帮助。

您可以将 ELASTICSEARCH_URL 环境变量设置为 https://USER:PASSWORD@some.domain:9200

这是可行的,因为由 elasticsearch-rails gem 初始化的客户端实际上是 elastic-transport-ruby gem 的客户端,而这个 gem 的客户端将使用 ELASTICSEARCH_URL 环境变量,定义如下:https://github.com/elastic/elastic-transport-ruby/blob/1dcb6c9db68dba70958e99d50e35a577d7d7f628/lib/elastic/transport/client.rb#L139-L144