Установите пароль для пользователя, который уже вошел в 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
Другие вопросы по тегам