Установите пароль для пользователя, который уже вошел в Devise
У меня следующая ситуация:
Пользователи могут зарегистрироваться в моем веб-приложении с помощью единого входа. В этом случае пароль не установлен. Я отмечаю это в таблице пользователей логическим столбцом no_password_set.
На странице настроек, когда я вижу, что логическое значение истинно, вместо того, чтобы дать пользователям возможность выбрать новый пароль, я поставил кнопку, которая отправляет им письмо со ссылкой для установки пароля.
Для этого я использую devise: send_reset_password_instructions, и в шаблоне электронной почты я немного изменяю текст, поэтому Забытый пароль меняется на Установить пароль.
Пока все хорошо, однако, когда пользователь нажимает на ссылку, он получает сообщение: вы уже вошли в систему. Как я могу избежать этого? Я хочу, чтобы пользователи могли выбирать пароль только после того, как они подтвердят это по почте. В противном случае злоумышленник может открыть браузер на чьем-либо компьютере, установить пароль и использовать его.
Выход пользователя из системы, когда он нажимает на ссылку, чтобы установить пароль, также будет приемлемым...
2 ответа
Я нашел рабочее решение для этого.
Создайте этот контроллер:
class PasswordsController < Devise::PasswordsController
prepend_before_action :require_no_authentication, only: [:cancel ]
end
И измените файл маршрутов так:
devise_for :user, controllers: { passwords: 'passwords' }
Надеюсь, это сработает...
class Devise::PasswordsController < DeviseController
prepend_before_action :remove_session, only: [:edit]
prepend_before_action :require_no_authentication
private
def remove_session
sign_out resource if user_signed_in?
end
end