Разработать выход из системы автоматически после смены пароля - PullRequest
73 голосов
/ 24 ноября 2010

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

Ответы [ 8 ]

127 голосов
/ 01 февраля 2011

У меня была та же проблема, и мне кажется, что работает следующий код.

Предположим, что контроллер паролей настроен для одноэлементного маршрута.Также предположим, что аутентифицированная модель является учетной записью.При этом у вас есть следующее:

def update
  if current_account.update_with_password(params[:account])
    sign_in(current_account, :bypass => true)
    flash[:notice] = 'Password updated.'
    redirect_to account_path
  else
    render :action => :show
  end
end

Ключевым компонентом является вызов метода sign_in, который пытается повторно войти в учетную запись, но обходит обратные вызовы начальника и сохраняет учетную запись в сеансе.

11 голосов
/ 16 сентября 2012

Используйте этот код, чтобы избежать выхода.

sign_in(current_user, :bypass => true)
11 голосов
/ 21 июля 2012

Приведенный выше пример не работал для меня, используя несколько областей в Devise.

Мне пришлось добавить имя области / ресурса в путь sign_in, чтобы оно работало, и чтобы предотвратить хаос, мне также пришлось выйти из системы старого пользователя, иначе все виды путаницы будут в изобилии.

Изменения, которые мне нужно было сделать, выглядели бы примерно так, как в приведенном выше примере.

def update
   if current_account.update_with_password(params[:account])
     sign_out(current_account)
     sign_in(:account, current_account, :bypass => true)
     flash[:notice] = 'Password updated.'
     redirect_to account_path
   else
     render :action => :show
   end
end

Редактировать, чтобы добавить: я считаю, что мне пришлось принудительно выйти из системы, потому что где-то я перебил Devise'sкод, чтобы пользователи не выходили из системы во время определенных действий.Задним числом;не хорошая идея!Этот подход намного лучше!Дело в том, что безопаснее создавать свои собственные контроллеры по сравнению с переопределением кода Devise, если это абсолютно не неизбежно.

5 голосов
/ 18 августа 2017

Вы можете просто установить sign_in_after_reset_password в вашем devise.rb

config.sign_in_after_reset_password = true
3 голосов
/ 09 сентября 2012

Добавьте следующий код в ваш метод, в котором вы обновляете пароль пользователя, сразу после обновления пароля пользователя в базе данных:

def update
 . . . . .<your code>
 . . . . .<your code>

 sign_in(@user, :bypass => true)

 . . . . .<your code>
 . . . . .<your code>
end
2 голосов
/ 17 ноября 2013

По некоторым причинам current_user не равно @user, хотя current_user.id равно @user.id. Поэтому я должен использовать sign_in(@user, :bypass => true).

1 голос
/ 06 марта 2018

Обновление ответа Билла Эйзенгауэра выше -

sign_in(current_account, :bypass => true) устарело используйте bypass_sign_in current_account вместо

Более подробную информацию можно найти здесь http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#bypass_sign_in-instance_method

0 голосов
/ 06 мая 2011

Используйте регистрируемый модуль, который даст вам возможность зарегистрироваться и редактировать пользовательские функции

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...