Настроить Devise SessionsController создать действие - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу добавить функцию, которая будет перенаправлять пользователя с просроченным паролем на страницу сброса пароля.Мой контроллер выглядит следующим образом

class Users::SessionsController < Devise::SessionsController

  def create
    user = User.find_by(email: params[:user][:email].downcase)
    if user.password_expire?
      raw, enc = Devise.token_generator.generate(current_user.class,
                                               :reset_password_token)
      user.reset_password_token   = enc
      user.reset_password_sent_at = Time.now.utc
      user.save(validate: false)
      redirect_to edit_password_url(user, reset_password_token: raw)
    else
      self.resource = warden.authenticate!(auth_options)
      set_flash_message(:notice, :signed_in)
      sign_in(resource_name, resource)
      yield resource if block_given?
      respond_with resource, location: after_sign_in_path_for(resource)
    end
  end

end

Когда я отлаживаю с привязкой в ​​верхней части действия, я нахожу, что current_user существует и user_signed_in?правда.Как это возможно, что я вошел в систему до завершения метода создания?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Если вы используете расширение безопасности, вам вообще не нужно заботиться о реализации срока действия пароля.И если вы не используете его, вы должны проверить это - devise_security_extension .

0 голосов
/ 19 декабря 2018

Devise помнит, как текущий пользователь использует куки-файлы до тех пор, пока они не выйдут из системы.

То, что они попали в ваш маршрут входа, не означает, что они вышли из системы.

Погружение в Devise

Отслеживание кода в Devise для понимания того, что происходит, мы видим:

1. Devise :: SessionsController # create

class Devise::SessionsController < ApplicationController
  # ...
  def create
    # ...
    sign_in(resource_name, resource)
    # ...
  end
end

2. Devise :: Controllers :: Helpers # sign_in

  def sign_in(resource_or_scope, *args)
    # ...
    if options[:bypass]
      warden.session_serializer.store(resource, scope)
    elsif warden.user(scope) == resource && !options.delete(:force)
      # Do nothing. User already signed in and we are not forcing it.
      true # <=== Here's the moment of truth
    else
    # ...
  end

Заключение

  • Пользователь может нажать на ваш sessions#create, когда он ужевошел в систему
  • В этом случае поведение Devise по умолчанию - ничего не делать
  • Не совсем уверен, чего вы хотите достичь выше, но вызов super может пригодиться где-нибудь, чтобы возобновить поведение Devise по умолчанию
...