设置Rails config.cache_classes=false导致env['warden'].user失效,find_verified_user未执行
解决
config.cache_classes=false时ActionCable的find_verified_user无法执行的问题 当开发环境设置config.cache_classes = false时,Rails会动态重新加载类,这会导致ActionCable的Connection类无法正确获取Devise的Warden上下文,进而让find_verified_user方法无法正常执行。以下是几种可行的解决方法:
方法1:确保Warden中间件注入ActionCable请求管道
在config/initializers/action_cable.rb中添加配置,让ActionCable服务器使用包含Warden的中间栈:
Rails.application.config.action_cable.middleware.use Warden::Manager do |config| Devise.warden_config(config) end
这样能保证ActionCable的请求能访问到Devise的Warden认证上下文。
方法2:调整find_verified_user的Warden获取方式
修改Connection类中的方法,直接从request对象中可靠获取Warden实例,避免类重新加载时env上下文丢失:
module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user logger.add_tags 'ActionCable', current_user.id end protected def find_verified_user if verified_user = warden.user verified_user else reject_unauthorized_connection end end private def warden request.env['warden'] || raise("Warden middleware未在ActionCable中配置") end end end
方法3:避免Connection类被动态重新加载
在config/environments/development.rb中,将ApplicationCable相关路径加入预加载列表,阻止Rails频繁重新加载该类:
config.eager_load_paths << Rails.root.join('app/channels/application_cable')
这样类缓存关闭时,Connection类不会被重复加载,上下文也能保持稳定。
内容的提问来源于stack exchange,提问作者genchemmer1234
相关产品推荐
相关产品推荐

