Авторизация авторизации Devise после смены пароля

Разработайте гем аутентификации в Rails.

Как предотвратить автоматический вход после смены пароля по ссылке «забыли пароль»?

В идеале было бы неплохо отображать страницу с сообщением «Новый пароль сохранен».


person Paul    schedule 18.05.2012    source источник


Ответы (4)


Вам нужно будет переопределить passwords_controller Devise, в котором вы можете увидеть методы по умолчанию для здесь. Во-первых, создайте свой собственный контроллер, который будет унаследован от контроллера Devise:

class User::PasswordsController < Devise::PasswordsController

Как только ваш контроллер будет готов, добавьте все другие методы, которые вы не хотите переопределять, и просто вызовите super внутри них. Это будут методы new, edit и create. Также не забудьте добавить защищенный метод after_sending_reset_password_instructions_path_for(resource_name).

Метод, который вы хотите переопределить, называется действием update.

def update
  self.resource = resource_class.reset_password_by_token(resource_params)

  if resource.errors.empty?
    flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
    set_flash_message(:notice, "Your flash message here")
    redirect_to new_user_session_path
  else
    respond_with resource
  end
end

Все, что мы изменим здесь, это удалить строку для входа пользователя с перенаправлением на страницу входа, а затем установить наше собственное флэш-сообщение.

Наконец, вы должны указать devise использовать ваш новый контроллер, поэтому в routes.rb измените devise_for :users на:

devise_for :users, :controllers => { :passwords => 'users/passwords' }

И это должно сделать это.

person janders223    schedule 19.05.2012

Вот обновление, основанное на 3.1.1 устройства

class Users::PasswordsController < Devise::PasswordsController

 def new
   super
 end

 def edit
   super
 end

 def create
   super
 end

 #override this so user isn't signed in after resetting password
 def update
    self.resource = resource_class.reset_password_by_token(resource_params)

    if resource.errors.empty?
      resource.unlock_access! if unlockable?(resource)
      flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
      set_flash_message(:notice, flash_message) if is_navigational_format?

      respond_with resource, :location => after_resetting_password_path_for(resource)
    else
      respond_with resource
    end

  end

protected

   def after_resetting_password_path_for(resource)
     new_session_path(resource)
   end

конец

person jschweitzer    schedule 22.10.2013

Начиная с Devise 3.5.0, этим поведением можно управлять с помощью параметра, который может можно найти в config/initializers/devise.rb:

# When set to false, does not sign a user in automatically after their password is
# reset. Defaults to true, so a user is signed in automatically after a reset.
config.sign_in_after_reset_password = false

Отображаемое мигающее сообщение будет Your password has been changed successfully., но его можно изменить в config/locales/devise.en.yml:

en:
  devise:
    passwords:
      updated_not_active: New password has been saved
person Timitry    schedule 10.01.2019
comment
Что делать, если я использую собственный UsersController? Я изменил это поведение в devise.rb, но ничего не изменилось, также не работает sign_in current_user, bypass:true. - person André Rocha; 29.10.2020
comment
Зависит от того, как выглядит ваш контроллер. Наследуется ли он от какого-то Devise-Controller? Вы звоните super? Если нет, вы должны реализовать логику самостоятельно. Взгляните на контроллер паролей, где используется настройка. - person Timitry; 30.10.2020

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

person logesh    schedule 22.11.2012