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

Next.js中如何统一认证所有嵌套路由?

批量实现Next.js路由认证的方案

针对你需要给所有/admin前缀路由统一做认证的需求,推荐以下几种无需逐个页面配置的方案:

一、Next.js Middleware(优先推荐,Next.js 12+)

Middleware是Next.js官方推出的请求拦截机制,能在请求到达页面组件前统一处理路由规则,完美适配批量认证场景。

  1. 在项目根目录创建 middleware.ts(或.js)文件
  2. 编写路由匹配与认证逻辑:
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  // 匹配所有/admin开头的嵌套路由
  const isAdminRoute = request.nextUrl.pathname.startsWith('/admin');
  // 替换为你的实际认证逻辑,比如校验cookie里的token、session状态
  const isAuthenticated = request.cookies.get('auth_token') ? true : false;

  // 未认证访问admin路由时,重定向到登录页
  if (isAdminRoute && !isAuthenticated) {
    return NextResponse.redirect(new URL('/login', request.url));
  }

  // 认证通过或非admin路由,正常放行
  return NextResponse.next();
}

// 配置Middleware生效的路由规则
export const config = {
  matcher: '/admin/:path*', // 匹配所有/admin下的子路由,包括/admin本身
};
  • matcher 中的/admin/:path*会自动匹配所有/admin前缀的路由,无需逐个添加
  • 认证逻辑可根据实际业务调整,比如校验JWT签名、查询用户会话状态
  • 这种方式是在服务端/边缘节点处理,不会出现客户端页面闪烁,安全性更高

二、自定义App组件(Pages Router兼容方案)

如果你的项目使用的是Next.js 13之前的Pages Router,也可以在_app.tsx中统一处理客户端路由拦截:

import { useEffect } from 'react';
import { useRouter } from 'next/router';
import type { AppProps } from 'next/app';

function MyApp({ Component, pageProps }: AppProps) {
  const router = useRouter();

  useEffect(() => {
    const checkAuth = () => {
      const isAdminRoute = router.pathname.startsWith('/admin');
      // 客户端侧的认证判断,比如从localStorage取token
      const isAuthenticated = !!localStorage.getItem('auth_token');

      if (isAdminRoute && !isAuthenticated) {
        router.push('/login');
      }
    };

    // 路由切换完成后检查认证状态
    router.events.on('routeChangeComplete', checkAuth);
    // 页面初始加载时执行检查
    checkAuth();

    // 组件卸载时移除事件监听
    return () => router.events.off('routeChangeComplete', checkAuth);
  }, [router]);

  return <Component {...pageProps} />;
}

export default MyApp;

注意:这种方式是客户端侧拦截,可能会出现页面短暂闪烁的情况,适合对拦截时效性要求不高的场景。如果需要严格的服务端拦截,建议结合Middleware使用。

三、额外提示

  • 若使用Next.js 13+的App Router,Middleware的配置方式完全一致,无需修改
  • 认证逻辑要保证严谨性,比如不要仅判断token是否存在,还要校验token的有效性(如过期时间、签名)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:45:38