在项目里搭建过全局权限管理,请具体说明怎样基于 Vue Router 的路由守卫机制落地全局权限控制?
考察说明
考察候选人是否能结合 Vue Router 的路由守卫机制设计一套可落地的全局权限控制方案。
回答思路
- 【回答框架 1】全局权限控制的核心是让路由跳转在进入页面之前先做身份和权限校验。Vue Router 提供三种守卫:全局 beforeEach、beforeResolve、afterEach,以及路由级 beforeEnter 和组件内守卫。实现全局权限控制主要用全局前置守卫 beforeEach,因为它在导航确认前统一执行,适合做登录状态检查和路由元信息权限判断。
- 【回答框架 2】方案通常分几步。第一,注册全局守卫 beforeEach,在回调里获取目标路由 to 的 meta 字段,比如 requiresAuth 表示需要登录,roles 或 permission 表示所需权限。第二,先判断用户是否已登录,通常通过 Vuex 或 Pinia 中的 token 或用户信息。若未登录且目标需要认证,则跳转到登录页,并携带 redirect 参数以便回跳。
- 【回答框架 3】第三,若已登录但要访问的路由需要特定权限,检查用户权限列表是否包含目标路由要求的一个或多个权限。不满足则重定向到 403 页面或提示无权限。为了减少重复逻辑,可以把权限判断封装成工具函数或指令,但路由守卫通常是集中控制的入口。需要注意通用权限模型:路由元信息中声明所需权限,用户权限集合在登录后从后端获取并存入状态管理。
- 【回答框架 4】实践上还要处理动态路由:权限控制的另一种做法是依据用户角色或权限列表动态生成可访问的路由表,通过 router.addRoute 注册,并在 beforeEach 中处理刷新页面后路由丢失的问题,例如在守卫中从后端重新拉取权限并动态添加。但简单项目里,用静态路由加守卫判断就足够。
- 【回答框架 5】风险与注意点:守卫是异步的,登录状态获取可能涉及异步请求,需在守卫中确保状态就绪;路由切换时若要校验权限,最好在 beforeEach 中完成,afterEach 常用于设置页面标题或进度条;还需考虑死循环问题,比如重定向时目标路由仍不满足条件,需用白名单或判断条件跳出循环。
- 【关键点 1】Vue Router 全局前置守卫 beforeEach 是权限控制的集中点,通过 to.meta 配置路由所需权限。
- 【关键点 2】未登录时跳转登录页并携带 redirect 参数实现登录后回跳。
- 【关键点 3】已登录但权限不足时重定向到 403 页面,避免直接渲染无权限组件。
- 【关键点 4】动态路由方案下,刷新页面需重新从后端获取权限并调用 router.addRoute 注册路由。
- 【易错点 1】守卫中异步获取用户状态时要避免死循环,需用白名单或条件判断。
- 【易错点 2】不能只做路由守卫,按钮级权限或接口权限仍需单独校验,否则可绕过前端控制。
- 【易错点 3】使用 addRoute 时注意路由重复添加或顺序问题,导致匹配错误。