在公共云和 PaaS 环境中运行时,应用程序需要在生产中保护许多秘密。常见的是 mysql 用户和密码的 database.yml 条目,但也可以有其他条目。您的 Google 应用程序秘密、Facebook 应用程序秘密……不胜枚举。没有明确的方法来保护这些本质上的配置参数。您不想将这些放在文件中,因为无法保证谁可以访问它。
在 Heroku 中,您可以通过环境变量指定事物。在 Cloudbees(一种 Java PaaS)中,您可以将这些指定为 Java 系统属性。Heroku 和 Cloudbees 都具有用于上传此配置参数的命令行实用程序,但不支持在开发和生产中轻松完成这项工作。
问题是你如何配置你的参数,以便你可以在开发中轻松开发,但在开发中没有生产秘密可用
理想情况下,将有一个可以在 ruby 和 jruby 环境和 PaaS 中工作的 gem,它允许我在 YML 文件中指定我的秘密,该文件具有开发中的开发设置,但实际的生产秘密从ENV
或java.lang.System.getProperty
.
##
# file: config/secure_config.yml
development:
db:
user_id: 'dev_mysql_user'
password: 'my_dev_pwd'
google:
app_id: 'xxxxx' # this is the secret for the dev app so it can be visible
app_secret: 'xxxxx'
# ...
production:
db:
user_id: <%= get_secure_config %>
password: <%= get_secure_config %>
google:
app_id: <%= get_secure_config %>
app_secret: <%= get_secure_config %>
get_secure_config 帮助程序从 Ruby 或 jRuby 获取值的ENV
位置java.lang.System.getProperty
。最后,您可以根据需要在您的应用程序中使用它们。例如在 database.yml 或设计代码中使用 google 进行身份验证。
# config/database.yml
# ...
production:
adapter: mysql2
username: <%= SecureConfig.db.user_id %>
password: <%= SecureConfig.db.password %>
然后为了更酷,gem 还应该给我一个可执行文件,允许我将配置推送到我的 PaaS
~/work/myproject> bundle exec secure_config -push_to_heroku
或者
~/work/myproject> bundle exec secure_config -push_to_cloudbees