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

