Rails+Next.js项目中Devise的current_user方法无法使用问题
Devise current_user返回null的解决方案(Rails API + Next.js Todo应用)
问题根因分析
你的ApplicationController继承自ActionController::API,但只引入了ActionController::Cookies和自定义的WithRescueConcern,没有引入Devise核心的认证辅助模块,导致current_user方法无法识别会话中的登录用户,最终返回null。而直接用User.find(1)能正常返回数据,是因为这是绕开会话认证的直接数据库查询,和Devise的会话管理无关。
具体修复步骤
- 在ApplicationController中引入Devise认证辅助模块
修改app/controllers/application_controller.rb,添加Devise::Controllers::Helpers:
# frozen_string_literal: true class ApplicationController < ActionController::API include ActionController::Cookies include WithRescueConcern include Devise::Controllers::Helpers # 新增:引入Devise认证辅助方法 end
- 配置Devise适配API场景
打开config/initializers/devise.rb,调整以下配置项,确保会话管理适配API请求:
# 启用HTTP认证支持 config.http_authenticatable = true # 关闭HTML格式的导航响应(API不需要) config.navigational_formats = [] # 指定退出请求方式为DELETE config.sign_out_via = :delete
- 保护CurrentUser接口(可选但推荐)
在CurrentUserController中添加前置过滤器,确保只有已登录用户能访问该接口:
module Api module V1 module Devise class CurrentUserController < ApplicationController before_action :authenticate_user! # 新增:强制用户登录后才能访问 # ... 原有代码 end end end end
- 前端请求需携带凭证
在Next.js的请求中,务必添加credentials: 'include',确保登录后的会话Cookie被正确传递到Rails后端:
// 示例:获取当前用户的请求代码 async function getCurrentUser() { const res = await fetch('/api/v1/current_user', { method: 'GET', credentials: 'include' // 必须添加,否则Cookie不会被携带 }); return res.json(); }
验证修复效果
重新启动Rails服务器,登录后调用/api/v1/current_user接口,此时current_user应该能正确返回登录用户的信息,序列化后的JSON不再是{"data":null}。
内容的提问来源于stack exchange,提问作者Tsubasa
相关产品推荐
相关产品推荐

