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

在Next.js中同时实现next-auth中间件与自定义路由逻辑

在Next.js中间件中结合Next-Auth实现路由保护与重定向

你完全可以在Next-Auth的withAuth中间件之外添加自定义逻辑,或者直接用常规中间件实现全部需求,以下是两种可行方案:

方案一:在withAuth中扩展自定义逻辑

withAuth并没有完全接管中间件,你可以在它的回调函数里插入自己的重定向逻辑,同时保留路由保护功能:

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

export default withAuth(
  function middleware(req) {
    // 已授权用户访问/auth路径时,直接重定向到dashboard
    if (req.nextUrl.pathname.startsWith("/auth") && req.nextauth.token) {
      return NextResponse.redirect(new URL("/dashboard", req.url))
    }
  },
  {
    // 配置路由保护的授权规则:只有带有效token的用户能访问受保护路径
    callbacks: {
      authorized: ({ token }) => !!token,
    },
    // 指定需要应用中间件的路径:包含需要保护的dashboard和需要重定向的auth
    matcher: ["/dashboard/:path*", "/auth/:path*"],
  }
)

方案二:用常规中间件手动实现全部逻辑

如果不想依赖withAuth,也可以直接在常规中间件里调用Next-Auth的getToken方法获取用户会话,自行实现两项功能:

import { getToken } from "next-auth/jwt"
import { NextResponse } from "next/server"

export async function middleware(req) {
  // 从请求中获取用户的JWT token
  const token = await getToken({ req, secret: process.env.NEXTAUTH_SECRET })
  const currentPath = req.nextUrl.pathname

  // 逻辑1:已登录用户访问/auth路径,重定向到dashboard
  if (currentPath.startsWith("/auth") && token) {
    return NextResponse.redirect(new URL("/dashboard", req.url))
  }

  // 逻辑2:未登录用户访问受保护路径,重定向到登录页
  if (currentPath.startsWith("/dashboard") && !token) {
    return NextResponse.redirect(new URL("/auth/login", req.url))
  }

  // 其他路径正常放行
  return NextResponse.next()
}

// 指定需要应用中间件的路径范围
export const config = {
  matcher: ["/dashboard/:path*", "/auth/:path*"],
}

注意事项

  • 确保环境变量中配置了NEXTAUTH_SECRET,getToken方法需要用到它解析JWT
  • 可以根据实际业务调整matcher里的路径规则,比如添加更多需要保护或重定向的页面
  • 如果使用Next-Auth的数据库会话模式,需要改用getSession方法,但getToken在中间件中的性能更优,推荐优先使用JWT模式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:45:34