Vue Router全局守卫beforeEach不触发,单路由beforeEnter可正常运行
问题根因
- 核心问题:你没有执行
Auth0.routeGuard函数
代码里仅写了Auth0.routeGuard只是引用了这个函数对象,没有加括号调用,自然不会运行守卫逻辑。 - 全局守卫的参数和返回值需要手动处理
写在beforeEnter里时,Vue Router会自动给Auth0.routeGuard注入to/from/next参数,并且自动处理它的返回值(比如重定向、中断导航等)。但你手动写在beforeEach回调里时,需要自己传递参数、返回守卫的执行结果,否则Vue Router接收不到守卫的判定结果,相当于没有做权限校验。 beforeEach的回调没有接收路由参数
你当前的beforeEach回调没有声明to/from/next参数,也无法把路由信息传递给Auth0.routeGuard使用。
修复方案
修改router.beforeEach的逻辑如下:
// 先接收路由守卫的三个参数,TS可以自动推导类型,也可以手动标注为NavigationGuardWithThis<undefined> router.beforeEach(async (to, from, next) => { store.commit(Mutations.RESET_LAYOUT_CONFIG); // 1. 调用routeGuard,传入参数,接收返回结果 const guardResult = Auth0.routeGuard(to, from, next); // 如果是异步守卫可以加await,根据Auth0 SDK的实际实现调整 // const guardResult = await Auth0.routeGuard(to, from, next); // 2. 如果守卫返回了false/重定向地址,直接返回结果,不执行后续逻辑 if (guardResult !== true && typeof guardResult !== 'undefined') { return guardResult; } await store.dispatch(Actions.VERIFY_AUTH); // 每次路由切换时页面滚动到顶部 setTimeout(() => { window.scrollTo(0, 0); }, 100); // 最终放行 next(); });
如果你用的是Vue Router 4+,也可以直接把Auth0.routeGuard作为参数直接传给beforeEach,不需要自己包一层回调,写法更简单:
router.beforeEach(Auth0.routeGuard); // 如果需要同时执行其他逻辑,可以组合多个守卫 router.beforeEach((to, from, next) => { store.commit(Mutations.RESET_LAYOUT_CONFIG); // 其他逻辑... next(); });
内容的提问来源于stack exchange,提问作者TinyTiger
相关产品推荐
相关产品推荐

