Next.js中间件重定向异常解决及登录权限控制实现
问题分析与修复方案
原代码的权限逻辑存在以下核心问题:
- 逻辑冲突:普通用户与管理员的权限判断串行执行,导致访问管理员页面时会先触发普通用户的未登录跳转逻辑,覆盖了管理员的跳转规则
- 跳转目标错误:管理员未登录时被错误导向
/login,而非需求指定的/admin - 权限隔离缺失:未限制普通用户访问管理员页面、管理员访问普通用户页面的越权场景
以下是修复后的完整代码:
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
相关产品推荐
相关产品推荐

