Защита паролем ActionMailer

Неужели я сумасшедший, или это плохая идея, чтобы сохранить имя пользователя и пароль SMTP для ActionMailer в фактическом файле конфигурации (разработки/производства)? Похоже, я должен хранить это зашифрованное место или, по крайней мере, исключить его из моего Mercurial, толкает.

Прямо сейчас, я просто удаляю пароль из исходного файла перед выполнением нажатия, но должен быть более умный способ, чем тот, который я использую.:)

Возможно, я должен сохранить его в моей базе данных в качестве другого пользователя (который уже хранится с зашифрованными паролями) и получить его программно?

Ответ 1

Используйте файл конфигурации приложения , который не хранится в вашем репозитории для хранения конфиденциальной информации. Вот как я это сделал:

  • Добавьте app_config.yml в каталог config. Его содержимое будет выглядеть так:

    smtp_password: kl240jvfslkr32rKgjlk
    some_other_password: 34hg9r0j0g402jg
    and_so_on: [email protected]
    
  • Добавьте preinitializer.rb в каталог config со следующим содержимым:

    require 'yaml'
    APP_CONFIG = YAML.load(File.read(RAILS_ROOT + "/config/app_config.yml"))
    
  • Подставьте свои пароли для значений в переменной APP_CONFIG, например:

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

Убедитесь, что вы не включаете app_config.yml в свой репозиторий, хотя вы можете захотеть создать примерный файл, который установлен, чтобы показать образец того, что должно быть в нем. При развертывании приложения убедитесь, что app_config.yml хранится на сервере. Если вы используете стандартное развертывание Capistrano, поместите файл в общую папку и обновите задачу развертывания, чтобы создать символическую ссылку на него в текущей директории выпуска.

Ответ 2

Ответ на 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