Ruby on rails 自定义设计会话控制器创建操作

Ruby on rails 自定义设计会话控制器创建操作,ruby-on-rails,devise,passwords,Ruby On Rails,Devise,Passwords,我想添加一个功能,可以将密码过期的用户重定向到重置密码页面。 我的控制器看起来像这样 class Users::SessionsController < Devise::SessionsController def create user = User.find_by(email: params[:user][:email].downcase) if user.password_expire? raw, enc = Devise.token_generat

我想添加一个功能,可以将密码过期的用户重定向到重置密码页面。 我的控制器看起来像这样

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
class用户::sessioncontroller

当我在操作顶部使用binding.pry进行调试时,我发现当前用户存在,并且用户已登录?这是真的。在创建方法完成之前,我怎么可能已登录?

Desive会记住当前用户使用Cookie,直到他们注销

仅仅因为他们撞上了你的登录路线并不意味着他们就退出了

潜入设计 跟踪Desive中的代码以了解我们看到的情况:

1

classdevise::sessioncontroller
2

def登录(资源或范围,*args)
# ...
如果选项[:旁路]
warden.session_serializer.store(资源,范围)
elsif warden.user(范围)=资源&&!选项。删除(:force)
#什么也不做。用户已登录,我们不会强制用户登录。

true#如果您使用的是安全扩展,则根本不需要考虑密码过期的实现。 如果你没有使用它,你应该检查一下-

class Devise::SessionsController < ApplicationController
  # ...
  def create
    # ...
    sign_in(resource_name, resource)
    # ...
  end
end
  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