Разрешить сброс пароля devise только после подтверждения по электронной почте

#ruby-on-rails #email #devise

#ruby-on-rails #Адрес электронной почты #devise

Вопрос:

У меня довольно стандартная установка devise с recoverable confirmable включенными обоими и.

Дело в том, что мне нужно отключить сброс пароля, если пользователь еще не подтвердил свою электронную почту

Например:

  • пользователь регистрируется по электронной почте whatever@example.com
  • отправляется письмо с подтверждением
  • пользователь переходит на страницу и сбрасывает пароль перед подтверждением своей электронной почты
  • электронное письмо со сброшенным паролем не должно отправляться

Комментарии:

1. У меня есть эта проблема, плюс еще один плохой побочный эффект. Когда пользователь делает это и переходит к экрану сброса пароля, он может ввести любой пароль, который он хочет, и два пароля даже не должны совпадать.. Странно.

2. Я не сталкивался с такой ошибкой, а с другой. Когда вы не подтверждаете электронное письмо и переходите по ссылке, указанной в вашем «электронном письме со сброшенным паролем», у вас есть только один шанс изменить его, в противном случае отображается «недопустимый токен», но когда вы подтверждаете электронное письмо, все в порядке

Ответ №1:

Я знаю, что это старая проблема, но у меня был тот же вариант использования, и я решил его, переопределив метод devise send_reset_password_instructions для пользовательской модели. Вот окончательная версия моего метода:

 def self.send_reset_password_instructions(attributes={})
  recoverable = find_or_initialize_with_errors(reset_password_keys, attributes, :not_found)

  if (recoverable.persisted? amp;amp; !recoverable.confirmed?)
    recoverable.errors.add(:email, I18n.t('devise.failure.not_verified'))
  else
    recoverable.send_reset_password_instructions
  end

  recoverable
end
  

Чтобы быть более конкретным — если пользователь сохраняется в базе данных, но не проверяется по электронной почте, добавьте ошибку и пропустите отправку пароля для сброса по электронной почте.