我有一个项目配置为使用Rails加密的秘密。一切正常,直到我尝试访问production.rb
环境文件中的秘密。
我发现如果我尝试在配置块中访问类似Rails.application.secrets.smtp_user_name
的内容,它会清除所有加密的秘密(我只留下secrets.yml
中的内容...我是哪个'我不用)。例如:
Loading production environment (Rails 5.1.2)
irb(main):001:0> Rails.application.secrets
=> {:secret_key_base=>nil, :secret_token=>nil}
如果我删除了访问机密的尝试,它可以正常工作:
irb(main):001:0> Rails.application.secrets
=> {:secret_key_base=>"...", :smtp_user_name=>"...", :smtp_password=>"...", :secret_token=>nil}
我目前正在使用production.rb
中的两个配置块来解决这个问题,如下所示:
# This is hacky, it needs to come before the second configure block where
# the encrypted secrets are used.
Rails.application.configure do
config.read_encrypted_secrets = true
end
Rails.application.configure do
... stuff that uses Rails.application.secrets, like ActionMailer
end
其他人是否面临这种情况,可能有更正确的解决方法?
为什么会发生这种情况很有道理(Rails不知道加载加密的秘密,因为我们没有告诉你),但我认为必须有更好的方法来处理它。
更新
9个月后再次将我钉死了。需要说明的是,如果您在调用Rails.application.secrets
之前引用config.read_encrypted_secrets = true
,则会缓存空的机密而无法访问secrets.yml.enc
中的任何值!
在我的情况下,当application.rb
设置config.read_encrypted_secrets = true
时,我尝试在production.rb
中配置Paperclip S3凭据。结果是devise.rb
试图读取密钥库的秘密,所有这些都是因为application.rb
我已经有效地缓存了无秘密。
答案 0 :(得分:1)
这是与您的问题相关的错误报告:
https://github.com/rails/rails/issues/30362#issuecomment-326821656
一般情况下,即使您已正确设置所有内容,也需要检查订单您的应用程序如何加载机密信息。如果您的应用程序首先询问Rails.application.secrets
然后设置正确的标记... Rails.application.secrets
将缓存版本而不保密......并且来自secret.yml.enc
的秘密将不会合并。