Защита паролем 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