You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Adonis Inertia配置中共享User无法传入Vue Props问题排查

问题

默认情况下,Adonis Inertia.js配置文件包含以下代码段:

sharedData: {
    user: (ctx) => ctx.inertia.always(() => ctx.auth.user),
},

但在Vue组件中通过defineProps获取user时,值为undefined。

我使用Ally完成微软账号认证,登录流程会创建用户,对应控制器代码如下:

import type { HttpContext } from '@adonisjs/core/http'
import User from '#models/user'

export default class MicrosoftLoginsController {
  public async redirect({ally}: HttpContext) {
      return ally.use('microsoft').redirect()
  }

  public async handleCallback ({ally, auth, response}: HttpContext) {
      const ms = ally.use('microsoft')

      if (ms.accessDenied()) {
         return 'You have cancelled the login process'
      }

      if (ms.stateMisMatch()) {
         return 'We are unable to verify the request. Please try again'
      }
      
      if (ms.hasError()) {
          return ms.getError()
      }

      const user = await ms.user()

      const findUser = {
          email: user.original.mail
      }

      const userDetails = {
          fullName: user.original.displayName,
          email: user.original.mail,
          providerId: user.original.id,
          provider: 'microsoft'
      }

      const newUser = await User.firstOrCreate(findUser, userDetails)

      await auth.use('web').login(newUser)

      return response.redirect('/')
    }
}

我遗漏了什么配置?AdonisJS官方文档对此说明不够详细。

排查与解决方案
  • 对齐认证守卫:
    控制器中用auth.use('web')完成登录,但Inertia配置里的ctx.auth.user默认调用的是默认守卫。检查config/auth.ts的default.guard是否为web,如果不是,需要在Inertia配置中明确指定守卫:

    user: (ctx) => ctx.inertia.always(() => ctx.auth.use('web').user),
    
  • 调整中间件执行顺序:
    确保Inertia中间件(@adonisjs/inertia/inertia_middleware)在认证中间件之后执行。在start/kernel.ts的server.middleware数组中,把认证中间件放在Inertia中间件前面,这样共享数据时ctx.auth.user才能被正确获取。

  • 验证首页路由的渲染方式:
    登录后重定向的/路由,必须是通过inertia.render渲染的Inertia页面,而非普通视图渲染。只有Inertia渲染的页面才会自动注入共享数据,否则前端无法获取到user。

  • 检查User模型序列化规则:
    如果User模型有隐藏字段或未配置序列化,会导致ctx.auth.user的数据无法正确传递到前端。可以在User模型中添加serialize()方法,明确指定需要传递的字段:

    import { DateTime } from 'luxon'
    import { BaseModel, column } from '@adonisjs/core/orm'
    
    export default class User extends BaseModel {
      @column({ isPrimary: true })
      public id: number
    
      @column()
      public fullName: string
    
      @column()
      public email: string
    
      // 其他字段...
    
      public serialize() {
        return {
          id: this.id,
          fullName: this.fullName,
          email: this.email,
          // 添加需要暴露给前端的字段
        }
      }
    }
    
  • 调试共享数据生成过程:
    在Inertia配置的user回调中添加日志,确认ctx.auth.user是否存在:

    user: (ctx) => {
      console.log('当前认证用户:', ctx.auth.user)
      return ctx.inertia.always(() => ctx.auth.user)
    },
    

    启动服务后查看控制台输出,判断是Auth未获取到用户,还是Inertia共享数据环节出了问题。


内容的提问来源于stack exchange,提问作者RyanJMP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:35:00