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

Next.js中间件重定向异常解决及登录权限控制实现

问题分析与修复方案

原代码的权限逻辑存在以下核心问题:

  1. 逻辑冲突:普通用户与管理员的权限判断串行执行,导致访问管理员页面时会先触发普通用户的未登录跳转逻辑,覆盖了管理员的跳转规则
  2. 跳转目标错误:管理员未登录时被错误导向/login,而非需求指定的/admin
  3. 权限隔离缺失:未限制普通用户访问管理员页面、管理员访问普通用户页面的越权场景

以下是修复后的完整代码:

import { NextResponse } from 'next/server'
import { NextRequest } from 'next/server'

export function middleware(request) {
  const token = request.cookies.get("token")?.value;
  const admintoken = request.cookies.get("admintoken")?.value;
  const path = request.nextUrl.pathname;

  // 定义路径分组,清晰区分不同类型页面
  const isUserAuthPage = ['/login', '/signup'].includes(path);
  const isAdminAuthPage = path === '/admin';
  const isUserProtectedPath = path.startsWith('/home/') || path.startsWith('/users/') || path === '/home';
  const isAdminProtectedPath = path.startsWith('/dashboard/') || path === '/dashboard';

  // 1. 处理已登录用户访问登录页面的跳转逻辑
  if (isUserAuthPage) {
    if (token) return NextResponse.redirect(new URL('/home', request.url));
    if (admintoken) return NextResponse.redirect(new URL('/dashboard', request.url));
    return NextResponse.next();
  }

  if (isAdminAuthPage) {
    if (admintoken) return NextResponse.redirect(new URL('/dashboard', request.url));
    if (token) return NextResponse.redirect(new URL('/home', request.url));
    return NextResponse.next();
  }

  // 2. 校验普通用户保护页面的访问权限
  if (isUserProtectedPath) {
    if (!token) return NextResponse.redirect(new URL('/login', request.url));
    // 可选:禁止管理员访问普通用户页面,按需开启
    if (admintoken) return NextResponse.redirect(new URL('/dashboard', request.url));
    return NextResponse.next();
  }

  // 3. 校验管理员保护页面的访问权限
  if (isAdminProtectedPath) {
    if (!admintoken) return NextResponse.redirect(new URL('/admin', request.url));
    // 可选:禁止普通用户访问管理员页面,按需开启
    if (token && !admintoken) return NextResponse.redirect(new URL('/home', request.url));
    return NextResponse.next();
  }

  // 未匹配到规则的路径直接放行
  return NextResponse.next();
}

export const config = {
  matcher: ['/users/:path*','/dashboard/:path*','/login','/signup','/admin','/home/:path*'],
}

关键改动说明:

  • 路径分组归类:将页面按「普通登录页、管理员登录页、普通用户保护页、管理员保护页」分组,逻辑更清晰易维护
  • 逻辑顺序优化:先处理登录页的跳转逻辑,再校验各角色的保护页面权限,彻底避免逻辑冲突
  • 跳转目标修正:管理员未登录访问仪表盘时,正确跳转到/admin而非/login
  • 权限隔离增强:增加不同角色越权访问的跳转处理,确保权限边界清晰(越权拦截逻辑可根据实际需求调整)
  • 明确终止逻辑:每个判断分支都通过return终止后续逻辑,避免触发不必要的重复跳转

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:45:36