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

Strapi v4.14中全局中间件如何访问ctx.state.user

解决Strapi中间件/生命周期中无法获取ctx.state.user的问题

核心原因

你的中间件或生命周期代码执行时机早于Strapi的用户认证中间件,或者请求本身未经过认证,导致ctx.state.user未被注入。

具体解决方案

1. 调整中间件执行顺序

Strapi的users-permissions中间件负责将认证用户信息写入ctx.state.user,必须确保你的全局中间件在它之后执行:
在项目根目录的config/middlewares.js中修改顺序:

module.exports = [
  'strapi::errors',
  'strapi::security',
  'strapi::cors',
  'strapi::poweredBy',
  'strapi::logger',
  'strapi::query',
  'strapi::body',
  'strapi::session',
  'strapi::favicon',
  'strapi::public',
  'users-permissions', // 先执行认证中间件
  'global::your-middleware-name' // 你的全局中间件放在后面
];

2. 确保请求已认证

只有携带有效JWT Token的请求(比如前端登录后获取的token,放在请求头Authorization: Bearer <token>中),users-permissions中间件才会注入ctx.state.user。匿名请求或token无效的请求,ctx.state.user必然为空。

3. 生命周期钩子的注意事项

在内容类型的生命周期文件中访问ctx.state.user时:

  • 仅当请求来自外部客户端(带认证token)时,ctx.state.user才会存在;如果是Strapi后台操作或服务端内部调用(比如通过strapi.service调用),则没有用户上下文。
  • 确认生命周期钩子的上下文是否包含请求信息,例如在beforeCreate等钩子中,ctx应为请求上下文,若为空可尝试打印整个ctx对象确认结构。

4. 检查中间件作用范围

如果你的全局中间件被配置为仅作用于特定路由,需确保这些路由的请求会经过users-permissions中间件的处理,避免因路由匹配规则导致认证逻辑未执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:51:08