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


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.