路由鉴权

66 阅读2分钟

一、路由鉴权的核心目标

  1. 拦截未登录用户:阻止未登录用户访问需要登录的页面(如个人中心、订单页),强制跳转至登录页。
  2. 限制权限不足用户:即使已登录,若用户角色/权限不满足路由要求(如普通用户访问管理员页面),则拒绝访问(跳转至403页或首页)。

二、与“Pinia存储用户状态”“动态路由”的关系

三者是递进协作的关系:

  • Pinia存储用户状态:提供鉴权的“数据源”(用户是否登录、拥有哪些权限)。
  • 动态路由按需加载:提前过滤出用户“理论上可访问”的路由表(减少无权限路由的暴露)。
  • 路由鉴权:在用户实际访问路由时,再次验证权限(最终安全关卡)。

三、常见实现方式(以Vue Router为例)

通过导航守卫(导航钩子) 在路由跳转前执行鉴权逻辑:

// router/index.js
import { useUserStore } from '@/stores/user';

const router = createRouter({ ... });

// 全局前置守卫:路由跳转前鉴权
router.beforeEach((to, from, next) => {
  const userStore = useUserStore(); // 获取Pinia中的用户状态

  // 1. 未登录用户访问需登录的页面
  if (to.meta.requiresAuth && !userStore.isLogin) {
    return next('/login?redirect=' + to.path); // 跳转登录页,并记录目标路径
  }

  // 2. 已登录用户访问权限不足的页面
  if (to.meta.requiredRole && !userStore.roles.includes(to.meta.requiredRole)) {
    return next('/403'); // 跳转403页面
  }

  // 3. 鉴权通过,允许跳转
  next();
});

其中,to.meta中的requiresAuth(是否需要登录)、requiredRole(所需角色)是路由配置中定义的鉴权规则。

四、为什么需要路由鉴权?

  • 弥补动态路由的不足:动态路由仅控制“路由是否存在于路由表中”,但用户仍可能通过手动输入URL访问未加载的路由,路由鉴权可拦截此类操作。
  • 应对权限动态变化:若用户权限在会话中发生变更(如被降级),路由鉴权能实时生效,无需刷新页面。
  • 前端安全加固:减少对后端鉴权的完全依赖,提升用户体验(避免无效请求后才跳转错误页)。

总结

路由鉴权是用户访问路由的“守门人”,它以Pinia存储的用户状态为依据,在动态路由的基础上,通过导航守卫实现“访问前验证”,最终确保用户只能访问其有权限的页面。在实际项目中,它与后端接口鉴权(如JWT验证)结合,形成“前端防误触、后端保安全”的完整权限体系。