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

Next Auth动态路径[:slug]未受保护问题求助

问题排查与修复

你的代码主要有两个问题导致动态根路径/:slug未被正确保护:

1. authorized 回调绕过默认授权检查

你在withAuth配置里设置了authorized: ({ token }) => true,这会让NextAuth认为所有请求都是授权的,即使未登录(token不存在)也会进入你的middleware函数。虽然你手动写了if(!token)的重定向逻辑,但可能因执行顺序或潜在错误导致未生效,而嵌套路径只是巧合触发了重定向。

2. 代码存在HTML实体语法错误

你代码里的&&是HTML转义字符,实际运行时会引发语法错误,中断middleware逻辑执行(这大概率是复制代码时的格式问题,但必须修正)。


修复后的完整代码

import { withAuth } from "next-auth/middleware";
import { NextResponse } from "next/server";

export default withAuth(
  function middleware(req) {
    const token = req.nextauth.token;
    const path = req.nextUrl.pathname;

    // 管理员可访问所有路径
    if (token.role === "admin") {
      return NextResponse.next();
    }

    if (token.role === "user") {
      const pathParts = path.split("/");
      const requestedSlug = pathParts[1];

      // 用户允许访问的子路径列表
      const allowedSubpaths = [
        "", // 主庆典页面
        "edit-profile",
        "guest-list",
        "service-partners",
        "table-layout",
        "timeline",
        "recommended-partners",
        "faq",
      ];

      if (
        requestedSlug &&
        requestedSlug !== "login" &&
        !requestedSlug.startsWith("_")
      ) {
        // 禁止访问不属于自己的庆典页面
        if (requestedSlug !== token.celebrationSlug) {
          return NextResponse.redirect(
            new URL(`/${token.celebrationSlug}`, req.url)
          );
        }

        const subpath = pathParts[2] || "";
        // 禁止访问未授权的子路径
        if (!allowedSubpaths.includes(subpath)) {
          return NextResponse.redirect(
            new URL(`/${token.celebrationSlug}`, req.url)
          );
        }
      }
    }

    return NextResponse.next();
  },
  {
    callbacks: {
      // 仅当存在有效token时才授权,未登录时NextAuth自动重定向到登录页
      authorized: ({ token }) => !!token,
    },
  }
);

export const config = {
  matcher: [
    // 受保护的路由
    "/admin/:path*",
    "/:slug",
    "/:slug/:path*" // 用该规则匹配所有嵌套路径,无需逐个列举
  ],
};

关键修复点说明

  • 调整authorized回调:改为({ token }) => !!token,让NextAuth自动处理未登录请求的重定向,避免手动判断逻辑引发的冲突。
  • 修正语法错误:将&&替换为正常的逻辑与运算符&&,确保middleware代码能正常执行。
  • 简化matcher规则:用/:slug/:path*替代所有嵌套路径的单独配置,既简化代码又避免遗漏子路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:50:05