Придумайте автоматичний вихід із системи після зміни пароля


76

У Devise, якщо я зміню пароль користувача та після оновлення в базі даних, сайт негайно вийде з системи. Я не хочу такої поведінки - як мені це робити. будь ласка, допоможіть.


3
"Ця функція була додана саме для таких сценаріїв. Адміністратор, редагуючи чийсь пароль, може бути впевнений, що особа вийде з системи. Дуже корисно в ситуаціях, коли у вас викрадено якийсь пристрій, а зміна пароля на веб-сайті забезпечить людина, яка викрала ваш пристрій, не зможе отримати доступ до зазначеного веб-сайту ". bit.ly/1qkO7jx
Zajo

bypass_sign_in (@user) для рейок> 5
vidur punj

Відповіді:


130

У мене була та сама проблема, і, здається, такий код працює для мене.

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

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, який намагається повторно ввійти в обліковий запис, але обходить зворотні виклики керівника та зберігає рахунок у сеансі.


Дякуємо за перевірку. Я здогадуюсь, що автор вже перейшов до інших проблем. Радий, що це працює для вас. Я все ще винен їхній вікі-сторінці, щоб допомогти іншим.
Білл Айзенхауер

1
Дякую, це спрацювало і у мене, хоча я не впевнений, чому Devise спочатку вийшов би з користувача.
Alex Korban,

6
Примітка для всіх майбутніх читачів, якщо це не спрацює, і вам потрібно спочатку додати sign_outвище sign_in, спочатку захопіть модель у змінну екземпляра, щоб ви могли передати її через sign_inметод, інакше ви будете передавати nil.
Simpleton

1
Якщо current_user.update_with_password(bleh)повертається, falseто, ймовірно, вам не вистачає поточного_пароля в параметрах, як це було у мене. Перевірте джерело
nicooga

1
@Questifer: ця відповідь передбачала, що реалізація розглядала пароль як односторонній ресурс. Таким чином, дією дії оновлення є суто сам пароль. Хоча це ніколи не було зрозуміло, і минуло кілька років, як я запропонував відповідь, ви можете собі уявити, що запит публікує старий пароль, новий пароль та пароль підтвердження. Сподіваюся, це допомагає.
Білл Айзенхауер,

11

Наведений вище приклад не спрацював для мене, використовуючи кілька областей в 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, щоб користувачі не виходили під час деяких дій. Оглянувшись назад; не гарна ідея! Такий підхід набагато кращий! Будучи тим, що безпечніше створювати власні контролери проти перевизначення коду Devise, якщо цього абсолютно не уникнути.


Нарешті! Знайшов його! Це спрацювало! Виявляється, я не потребував, sign_out current_userале потребував sign_in :user, @user, bypass: true.
Хлоя

11

Використовуйте цей код, щоб уникнути виходу.

sign_in(current_user, :bypass => true)

10

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

config.sign_in_after_reset_password = true

Чудове рішення, чи знаєте ви, чому вони вимикають це за замовчуванням? Здається, це повинно бути навпаки.
ricks

1
Як і в більшості речей у таких фреймворках, я підозрюю про зворотну сумісність.
codebreach

1
Станом на 2020 р. За замовчуванням це значення true, тому користувач автоматично входить в систему після зміни пароля.
Самі Бірнбаум,


4

Додайте наступний фрагмент коду до свого методу, в якому ви оновлюєте пароль користувача, відразу після оновлення пароля користувача в базі даних:

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

 sign_in(@user, :bypass => true)

 . . . . .<your code>
 . . . . .<your code>
end

2

З якихось причин current_userне дорівнює, @userхоча current_user.idдорівнює @user.id. Тож я повинен використовувати sign_in(@user, :bypass => true).


Це загадкова поведінка. Я підняв запитання, пов’язане з цим, але його видалили через відсутність відповіді. Для довідки stackoverflow.com/q/39490056/936494 - посилання на моє запитання.
Jignesh Gohel

Можливо, вам потрібно перезавантажити об'єкт користувача? спробуйте зателефонуватиuser.reload
ricks

1

Будь ласка, зверніться до цієї відповіді тут, я спробував усі вищезазначені відповіді. Це не працює, якщо не додати область. https://stackoverflow.com/a/30418266/4973585

Це не працює - sign_in @user, bypass: true

Це працює - sign_in :user, @user, bypass: true


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.