Devise超时问题:超时后只能通过Cookie传递参数吗?
针对你的双引擎Rails应用共享Devise认证、超时跳转需要多参数的场景,以下是几种无需依赖Cookie的可行方案:
方案1:通过Warden环境暂存参数
利用Warden在销毁session前的钩子,提前提取所需参数存入环境变量,后续在timeout方法中直接读取:
# 在Devise会话控制器或初始化文件中添加Warden钩子 Warden::Manager.before_logout do |user, auth, opts| # 从session和当前用户提取关键参数 auth.env['devise_timeout_context'] = { login_source: auth.session[:login_source], customer: user&.customer, location: user&.location } end # 重写的timeout方法中读取参数 def timeout context = request.env['devise_timeout_context'] || {} redirect_to custom_login_path( login_source: context[:login_source], customer: context[:customer], location: context[:location] ) end
方案2:预生成带参数的超时跳转URL
在用户每次活跃时,生成包含参数的跳转URL并存入session,让auto-session-timeout直接使用该URL:
# 重写auto-session-timeout的active方法 def active # 每次活跃更新带参跳转URL session[:timeout_target] = custom_login_path( login_source: session[:login_source], customer: current_user&.customer, location: current_user&.location ) super # 调用原active方法 end # 修改auto-session-timeout配置 # config/initializers/auto_session_timeout.rb AutoSessionTimeout.setup do |config| config.timeout_after = 30.minutes config.redirect_on_timeout = ->(controller) { controller.session[:timeout_target] || default_login_path } end
方案3:借助Devise Rememberable模块(若已启用)
如果应用开启了Rememberable,可通过remember_token反向查询用户,获取customer和location;login_source可在用户登录时存入用户模型字段:
# 用户登录时记录login_source class SessionsController < Devise::SessionsController def create super do |user| user.update(last_login_source: session[:login_source]) end end end # timeout方法中通过remember_token获取用户及参数 def timeout user = User.find_by(remember_token: cookies.signed[:remember_token]) if user redirect_to custom_login_path( login_source: user.last_login_source, customer: user.customer, location: user.location ) else redirect_to default_login_path end end
内容的提问来源于stack exchange,提问作者pabvald
相关产品推荐
相关产品推荐

