如何从Rails应用程序的数据库配置文件中获取全局变量?

时间:2019-03-27 13:33:01

标签: ruby-on-rails database

我想从Rails应用程序和主机旁边的其他地方获取秘密信息。我在config/initializers下创建了一个全局变量文件来获取密钥。然后在数据库连接文件中设置它们。像这样:

config / initializers / get_secrets.rb

@@username = 'A'
@@password = 'B'

config / database.yml

development:
  adapter: mysql2
  encoding: utf8
  database: my_db_name
  username: <%= @@username %>
  password: <%= @@password %>
  host: 127.0.0.1
  port: 3306

运行rails console时得到:

./config/initializers/get_secrets.rb:1: warning: class variable access from toplevel
(erb):10: warning: class variable access from toplevel
> 

在这种情况下,这似乎不是很好的用法。那有正确的方法吗?

1 个答案:

答案 0 :(得分:1)

在Rails 5.2 + 中,我们有一个master.key文件和一个凭据YAML文件。 master.key文件会加密您的凭据(因此,除了您的服务器外,不要向任何人显示此密钥)。

您可以通过执行以下操作来激活它:

EDITOR=vim rails credentials:edit

文件:

aws:
    key: 123
google_key: 456
secret_key_base: f230ffddd1d1f151j3bchjas9a292j221...

如果您要使用凭据,则如下所示:

Rails.application.credentials.google_key

或对于AWS一类的嵌套资源:

Rails.application.credentials.aws[:key]

但是,如果您使用的是 Rails 5.1或更低版本,则没有此功能。因此,您可以通过其他方式进行操作:

  1. 环境变量。您的程序环境始终可以导出ENV并进行检索。我总是这样做是为了避免简单的麻烦,例如测试电子邮件密码:

    export GMAIL_PASSWORD="1234"及其用法ENV['GMAIL_PASSWORD']

  2. Secrets.yml。这是一个基本上充当master.key +凭证的文件,它充当环境的凭证处理程序。它很简陋,常常错误地偶然地承诺回购,但我们会尽力做到:

    development:
      secret_key_base: 1112sdasae1d13d1tfd1d3... 
    
    
      GMAIL_PASSWORD: '1234'
    
    test:
      secret_key_base: _your_secret_ as above
    
    production:
      secret_key_base: <%= secure_token %>
    

它的访问方式类似于Rails.application.secrets.GMAIL_PASSWORD

如果无法访问变量,则可能是因为secrets.yml文件未加载或环境错误。请注意,这些var嵌套在特定的环境中。