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

Vue3+Firebase路由守卫:登录后禁止访问登录页死循环修复

问题原因

两个版本的路由守卫逻辑都存在分支判断漏洞,是导致空白、死循环的核心原因:

  • 第一版空白问题:对所有不需要鉴权的公开路由(含登录页/)做了无条件跳转/dashboard的逻辑,未登录用户访问时会触发「登录页跳控制台→控制台鉴权不通过打回登录页→登录页又跳控制台」的导航冲突,路由解析进程卡住,最终页面无内容渲染。
  • 第二版无限循环问题:在if判断分支外额外写了固定执行的next("/dashboard"),无论之前的分支逻辑做了什么跳转,最终都会被强制重定向到控制台,触发新一轮路由守卫判断,形成无限死循环。
修复方案

鉴权逻辑需要严格遵守两个规则,且每次导航仅调用一次next方法:

  1. 带requiresAuth: true标记的受保护路由:已登录用户直接放行,未登录用户跳转至登录页
  2. 无鉴权要求的公开路由(如登录页):未登录用户正常放行,已登录用户直接跳转至控制台,避免重复访问登录页

修正后的完整路由守卫代码如下:

const getCurrentUser = () => {
  return new Promise((resolve, reject) => {
    const removeListener = onAuthStateChanged(
      getAuth(),
      (user) => {
        removeListener()
        resolve(user)
      },
      reject
    )
  })
}

router.beforeEach(async (to, from, next) =>{
  // 提前获取一次用户状态,避免重复调用
  const currentUser = await getCurrentUser()
  // 判断目标路由是否需要鉴权
  const needAuth = to.matched.some((record) => record.meta.requiresAuth)

  if (needAuth) {
    // 受保护路由逻辑
    currentUser ? next() : next({ name: 'login' })
  } else {
    // 公开路由逻辑
    currentUser ? next({ name: 'dashboard' }) : next()
  }
})

优化提示:getCurrentUser方法每次调用都会绑定一次Auth状态监听器再解绑,频繁路由跳转时会产生不必要的性能开销,可以在应用初始化阶段就监听Auth状态,将用户信息存在全局响应式变量(如Pinia)中,路由守卫直接读取全局状态即可,不需要每次都等待异步状态返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:21:28