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

