首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails 6上定义secret_key_base的正确方法是什么?

在Rails 6上定义secret_key_base的正确方法是什么?
EN

Stack Overflow用户
提问于 2020-03-16 08:02:16
回答 3查看 9.9K关注 0票数 12

既然我们有了每个环境的凭证,那么在Rails 6上定义secret_key_base的正确方法是什么?

我的环境中有变量SECRET_KEY_BASE,但是Rails没有选择它。我尝试在secret_key_base中定义config\credentials\production.yml.enc,但它对Rails.application.credentials.secret_key_base没有影响

我知道config/secrets.yml

代码语言:javascript
复制
staging:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

很好,但是,那是Rails 6路吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-16 19:37:10

在Rails 6中访问和检查secret_key_base的正确方法不再是:~

代码语言:javascript
复制
Rails.application.credentials.secret_key_base

现在的情况是:

代码语言:javascript
复制
Rails.application.secret_key_base

我不确定这是Rails 6还是永远都是这样。当查看此方法及其实现时,这一点变得非常清楚:

https://github.com/rails/rails/blob/09a2979f75c51afb797dd60261a8930f84144af8/railties/lib/rails/application.rb#L410-L427

代码语言:javascript
复制
# The secret_key_base is used as the input secret to the application's key generator, which in turn
# is used to create all MessageVerifiers/MessageEncryptors, including the ones that sign and encrypt cookies.
#
# In development and test, this is randomly generated and stored in a
# temporary file in <tt>tmp/development_secret.txt</tt>.
#
# In all other environments, we look for it first in ENV["SECRET_KEY_BASE"],
# then credentials.secret_key_base, and finally secrets.secret_key_base. For most applications,
# the correct place to store it is in the encrypted credentials file.
def secret_key_base
  if Rails.env.development? || Rails.env.test?
    secrets.secret_key_base ||= generate_development_secret
  else
    validate_secret_key_base(
      ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
    )
  end
end

开发和测试模式都有自己的密钥库生成和存储方式。对于其他一切,它都是按照这个顺序从环境、凭据或秘密中显示出来的。

票数 26
EN

Stack Overflow用户

发布于 2020-06-30 08:55:10

开发中的Docker用户可能会在他们的entrypoint.sh中考虑到这一点。

代码语言:javascript
复制
if [ "$RAILS_ENV" = "development" ]; then
   printf $SECRET_KEY_BASE > ./tmp/development_secret.txt
fi
票数 0
EN

Stack Overflow用户

发布于 2020-03-16 08:52:08

几天前我试着解决那个问题。

我学到的是:

第一次尝试

我尝试在每个环境中使用凭据

代码语言:javascript
复制
$ EDITOR=nano rails credentials:edit --environment development

$ EDITOR=nano rails credentials:edit --environment staging

$ EDITOR=nano rails credentials:edit --environment production

我的and文件和密钥被放在config/credentials中。

我在那里设置了必要的变量。它是可用的解决方案,但是我们在Kubernetes集群的部署中遇到了一个问题,因为我们的开发者希望使用helm信任。因此,预定义的凭据不适用于这种情况。

第二次尝试

之后,我尝试在我的凭证文件中使用ENV-变量。不幸的是,它不太管用:

代码语言:javascript
复制
secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>

最终尝试

最后,当您将每个环境的设置放置在那里时,我使用默认配置对gem config进行了优雅的降级:

代码语言:javascript
复制
config/settings.yml
config/settings/development.yml
config/settings/production.yml
config/settings/test.yml

我的settings.yml文件只包含ENV-变量,如下所示:

代码语言:javascript
复制
secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>

db:
  host: <%= ENV['DB_HOST'] %>
  port: <%= ENV['DB_PORT'] %>
  pool: <%= ENV['DB_POOL'] %>
  user: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  database: <%= ENV['DB_DATABASE'] %>

...

这是可行的解决办法,但似乎是倒退。

正如我现在所知道的,我们不能简单地使用ENV作为凭证。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60702248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档