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

Strapi V4自定义路由中认证策略失效问题求助

解决Strapi 4.15.5自定义路由认证策略失效及用户信息获取问题

问题分析

你遇到的核心矛盾是:

  • 配置了global::is-authenticated策略的路由,策略未触发
  • 将路由设为公开(auth: false)后策略虽触发,但无法获取用户身份信息

这是因为Strapi 4的路由认证逻辑中,公开路由会跳过认证中间件,导致policyContext.state.user为空;而未明确配置auth属性的自定义路由,可能因默认配置或缓存问题未正确执行认证流程,进而跳过策略。

解决方案

1. 修正路由配置(TypeScript版本)

确保路由明确启用认证,并正确关联策略,修改src/api/zerei/routes/zerei.ts如下:

import type { RouteConfig } from '@strapi/strapi/lib/services/router';

export default {
  routes: [
    {
      method: 'GET',
      path: '/zerei',
      handler: 'zerei.index',
      config: {
        auth: true, // 明确启用认证中间件,这是关键
        policies: ['global::is-authenticated'],
      },
    },
  ],
} satisfies RouteConfig;

2. 验证全局认证策略逻辑

默认的global::is-authenticated策略会检查ctx.state.user是否存在,若你自定义过该策略,确认逻辑未被修改:

// 默认策略位置:node_modules/@strapi/plugin-users-permissions/server/policies/is-authenticated.js
module.exports = (policyContext, config, { strapi }) => {
  if (policyContext.state.user) {
    return true;
  }

  return false;
};

3. 清除Strapi缓存

Strapi可能缓存旧的路由配置,执行以下操作刷新:

  • 删除项目根目录下的.cache文件夹
  • 重新构建项目:npm run build
  • 重启Strapi服务:npm run develop

4. 确认控制器未绕过认证

检查你的zerei.index控制器,确保没有手动跳过认证逻辑:

export default {
  async index(ctx) {
    // 依赖路由策略的认证结果,不要手动跳过
    ctx.body = { message: 'Authenticated request', user: ctx.state.user };
  },
};

关键说明

  • 当路由设置auth: true时,Strapi会先执行认证中间件,将用户信息存入ctx.state.user,再执行配置的策略,此时global::is-authenticated能正确验证用户身份
  • 公开路由(auth: false)会跳过认证中间件,因此ctx.state.user为空,即便策略触发也无法获取用户信息,这是预期行为

内容的提问来源于stack exchange,提问作者Gabriel França

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:22:21