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

如何修改Next.js中间件,让已认证用户访问登录页时跳转至仪表盘?

已认证用户跳转与公共页面访问控制方案

要实现你需要的功能,只需在中间件里增加路径判断逻辑,分两种场景处理即可,完全可行。

修改后的中间件代码

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

export async function middleware(req: NextRequest) {
  // 实际项目替换为真实认证逻辑:从cookie/请求头取token并验证有效性
  const token = req.headers.get('token') || req.cookies.get('token')?.value
  const userIsAuthenticated = !!token // 此处为简化判断,实际需验证token合法性

  const currentPath = req.nextUrl.pathname

  // 定义已登录用户禁止访问的公共页面
  const publicRestrictedPaths = ['/login', '/register']
  // 定义未登录用户禁止访问的私有页面
  const privatePaths = ['/dashboard', '/api/private/:path*', '/profile']

  // 场景1:已认证用户访问登录/注册页 → 跳转至仪表盘
  if (userIsAuthenticated && publicRestrictedPaths.includes(currentPath)) {
    return NextResponse.redirect(new URL('/dashboard', req.url))
  }

  // 场景2:未认证用户访问私有页面 → 跳转至登录页
  if (!userIsAuthenticated && privatePaths.some(path => {
    // 处理带通配符的动态路径匹配
    if (path.includes(':path*')) {
      const basePath = path.replace(':path*', '')
      return currentPath.startsWith(basePath)
    }
    return currentPath === path
  })) {
    // 携带当前路径作为回调参数,登录后可直接跳回原页面
    const signinUrl = new URL('/login', req.url)
    signinUrl.searchParams.set('callbackUrl', currentPath)
    return NextResponse.redirect(signinUrl)
  }

  // 其他场景正常放行
  return NextResponse.next()
}

// 配置中间件生效路径,仅在需要控制的路径上运行,提升性能
export const config = {
  matcher: [
    '/login',
    '/register',
    '/dashboard/:path*',
    '/api/private/:path*',
    '/profile'
  ]
}

关键逻辑说明

  • 路径分组管理:将页面分为「已登录禁访的公共页」和「未登录禁访的私有页」,分别设置跳转规则,后续新增页面只需修改对应数组即可
  • 通配符路径兼容:对带:path*的动态路径,通过前缀匹配覆盖所有子路径,适配嵌套路由场景
  • 用户体验优化:跳转登录时携带当前访问的私有路径,用户登录完成后可直接返回原页面
  • 性能优化:通过matcher配置缩小中间件运行范围,避免在静态资源、公共文档等无需控制的路径上执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:25:03