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
相关产品推荐
相关产品推荐

