ActionMailer密码安全性

我是疯了,还是在实际(开发/生产)配置文件中保留ActionMailer的SMTP用户名和密码是个坏主意? 我似乎应该将它存储在一个加密的地方,或者至少将它从我的Mercurial推送中排除。

现在,我只是在执行推送之前从源文件中删除密码,但是必须比我正在使用的方式更聪明。 🙂

也许我应该将它作为另一个用户(已经存储有加密密码)存储在我的数据库中并以编程方式获取它?

使用未存储在存储库中的应用程序配置文件来存储敏感信息。 我是这样做的:

  1. config目录中添加app_config.yml 。 它的内容如下所示:

     smtp_password: kl240jvfslkr32rKgjlk some_other_password: 34hg9r0j0g402jg and_so_on: lkn$@gJkjgsFLK4gaj 
  2. config目录中添加preinitializer.rb ,其中包含以下内容:

     require 'yaml' APP_CONFIG = YAML.load(File.read(RAILS_ROOT + "/config/app_config.yml")) 
  3. 用您的密码替换APP_CONFIG变量中的值,如下所示:

     smtp_password = kl240jvfslkr32rKgjlk # old version smtp_password = APP_CONFIG['smtp_password'] # new version 

确保您的存储库中不包含app_config.yml ,但您可能希望创建一个已签入的示例文件,只是为了显示其中应包含的内容的示例。 部署应用程序时,请确保app_config.yml存储在服务器上。 如果您正在使用标准的Capistrano部署,请将该文件放在共享文件夹中并更新部署任务,以便在当前版本的目录中为其创建符号链接。

Jimmy的答案是完美的(+ 1),我还要注意Github已经为每种语言推荐了.gitignore文件,Rails就在这里注意它包含config / * .yml,这样就没有config / yml文件在资源库中首先。 可能是一个很好的举动。

使用Capistrano在部署时要求这些东西:设置方式与数据库内容相同:

 task :my_silly_task do sendgrid_password = Capistrano::CLI.password_prompt("Sendgrid password: ") require 'yaml' spec = {... whatever yaml you need -- probably what Jimmy said...} run "mkdir -p #{shared_path}/config" put(spec.to_yaml, "#{shared_path}/config/mailer_config.yml") end