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