Rails博客生产环境已登录仍提示登录 开发环境运行正常问题排查
Rails生产环境登录状态失效问题解决方案
问题本质
该问题为Rails生产环境session校验规则与开发环境不一致,导致session[:token]无法正常读取,@current_user为空触发authorized_user?回调拦截。
排查与解决步骤
- 快速定位问题环节
在current_user_concern.rb的set_current_user方法中添加日志,确认问题出在session传递还是用户查询:
- 快速定位问题环节
def set_current_user Rails.logger.info "Session token value: #{session[:token]}" if session[:token] @current_user = User.find_by(token: session[:token]) Rails.logger.info "Queried user ID: #{@current_user&.id}" end end
部署后调用一次create接口,查看生产日志即可确定问题所在。
- 修正session存储配置
编辑config/initializers/session_store.rb,适配生产环境站点属性:
- 修正session存储配置
Rails.application.config.session_store :cookie_store, key: '_blog_application_session', # 单域名部署直接填写实际域名,多域名部署写:all domain: 'yourdomain.com', # 二级域名填2,三级域名填3 tld_length: 2, # HTTPS站点设为true,未配置HTTPS的生产站点必须设为false,否则浏览器不会保存session cookie secure: Rails.env.production? ? true : false, same_site: :lax
- 校验secret_key_base配置
生产环境必须配置SECRET_KEY_BASE环境变量,否则session解密失败。执行rails secret生成有效密钥,配置到生产环境的进程环境变量中,确保Rails运行时可读取。
- 校验secret_key_base配置
- 前后端分离场景跨域配置
如果是前后端分离项目,需要同步配置两端允许凭证传递:
后端config/initializers/cors.rb配置:
- 前后端分离场景跨域配置
Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins '替换为你的前端实际访问域名' resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head], credentials: true end end
前端所有接口请求开启withCredentials: true配置,确保浏览器携带session cookie发送请求。
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

