You need to enable JavaScript to run this app. Vue路由角色为user时未正常跳转登录页问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Vue路由角色为user时未正常跳转登录页问题排查

问题根因排查

你代码的核心问题出在路由守卫的判断逻辑错误,其次存在异步请求时序问题和冗余代码问题,按以下步骤修复即可:

1. 修正逻辑判断错误

你当前的判断条件:

if (!store.getters["auth/authenticated"] && obj.includes("user"))

该条件的生效逻辑是**同时满足「用户未登录」和「用户角色为user」**才会触发跳转。但如果用户已经登录(authenticated为true),!authenticated就为false,整个条件直接不成立,已登录的user角色用户自然不会被拦截跳转。
如果你的需求是「未登录的用户、已登录但角色为user的用户,都要跳转登录页」,把&&改成||即可:

if (!store.getters["auth/authenticated"] || obj.includes("user"))

如果你的需求是「仅已登录的user角色用户需要跳转,未登录用户正常放行」,就去掉!authenticated的判断:

if (store.getters["auth/authenticated"] && obj.includes("user"))

2. 修复Vuex异步请求时序问题

你在attempt action中调用接口拉取用户信息、设置角色是异步操作,路由守卫执行时大概率接口还未返回,state.roles还是初始值null,此时调用includes会直接报错,导致跳转逻辑失效。
可以通过以下两种方案解决:

  • 方案一:应用初始化时先等待用户信息拉取完成再挂载路由
// 入口main.js
async function initApp() {
  const token = localStorage.getItem('token')
  if (token) {
    await store.dispatch('auth/attempt', token)
  }
  new Vue({
    router,
    store,
    render: h => h(App)
  }).$mount('#app')
}
initApp()
  • 方案二:路由守卫中增加等待逻辑,判断角色已加载完成再执行校验

3. 移除冗余代码,增加边界判断

你对userRole的序列化、反序列化操作完全是多余的,可以直接使用getter返回的数组,同时增加空值判断避免报错。
修改后的路由守卫参考:

name: "GrantQuotes",
component: GrantQuotes,
beforeEnter: (to, from, next) => {
  const isAuthenticated = store.getters["auth/authenticated"]
  const userRoles = store.getters["auth/userRole"]
  // 角色未加载完成时可以先跳转加载页或直接放行,等加载完成后二次校验
  if (!userRoles) return next()
  if (!isAuthenticated || userRoles.includes("user")) {
    return next({ name: "Login" })
  }
  next()
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:36:05