当前位置:首页 > VUE

vue实现动态权限路由

2026-01-22 22:27:04VUE

实现动态权限路由的核心思路

动态权限路由的核心是根据用户权限动态生成可访问的路由表。通常分为以下步骤:

  1. 初始化基础路由:定义无需权限的公共路由(如登录页、404页)。
  2. 获取用户权限:从接口或本地存储获取用户权限标识(如角色、权限列表)。
  3. 过滤动态路由:根据权限筛选出符合条件的路由配置。
  4. 添加路由到实例:通过router.addRoutes(Vue Router 3)或router.addRoute(Vue Router 4)注入路由。

基础路由与动态路由分离

// 基础路由(所有用户可见)
const constantRoutes = [
  { path: '/login', component: Login },
  { path: '/404', component: NotFound }
]

// 动态路由(需权限控制)
const asyncRoutes = [
  { path: '/admin', component: Admin, meta: { roles: ['admin'] } },
  { path: '/user', component: User, meta: { roles: ['user', 'admin'] } }
]

权限验证逻辑

通过路由的meta.roles字段与用户角色进行匹配:

vue实现动态权限路由

function hasPermission(roles, route) {
  if (route.meta?.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  }
  return true // 无meta.roles视为公开路由
}

路由过滤实现

递归过滤异步路由表:

vue实现动态权限路由

function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (hasPermission(roles, route)) {
      if (route.children) {
        route.children = filterRoutes(route.children, roles)
      }
      return true
    }
    return false
  })
}

完整流程示例

  1. 用户登录后获取角色
// 模拟获取用户角色
const roles = ['admin'] // 实际从接口获取
  1. 生成可访问路由
const accessedRoutes = filterRoutes(asyncRoutes, roles)
  1. 动态添加路由
router.addRoutes(accessedRoutes)
accessedRoutes.forEach(route => router.addRoute(route))
  1. 保存路由状态(可选):
store.commit('user/SET_ROUTES', accessedRoutes) // 存入Vuex/Pinia

404路由处理

动态路由添加后需在最后追加404路由:

// Vue Router 3
router.addRoutes([{ path: '*', redirect: '/404', hidden: true }])

// Vue Router 4
router.addRoute({ path: '/:pathMatch(.*)*', redirect: '/404' })

路由守卫控制

在全局前置守卫中实现权限控制:

router.beforeEach(async (to, from, next) => {
  if (hasToken()) {
    if (to.path === '/login') {
      next('/')
    } else {
      if (!hasRoles()) {
        try {
          const roles = await getRoles() // 获取用户角色
          const accessedRoutes = filterRoutes(asyncRoutes, roles)
          router.addRoutes(accessedRoutes)
          next({ ...to, replace: true }) // 确保addRoutes生效
        } catch (error) {
          next(`/login?redirect=${to.path}`)
        }
      } else {
        next()
      }
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next(`/login?redirect=${to.path}`)
    }
  }
})

注意事项

  1. 路由配置:动态路由的component需使用() => import()懒加载。
  2. 菜单生成:前端菜单通常基于过滤后的路由表渲染。
  3. 按钮权限:可与v-permission指令结合实现细粒度控制。
  4. 路由重置:退出登录时需要重置路由实例(Vue Router 4可通过router.removeRoute())。

扩展优化

  1. 路由持久化:将过滤后的路由存入sessionStorage避免每次刷新重新拉取。
  2. 后端控制:更安全的做法是由后端返回完整路由结构,前端直接注册。
  3. 路由缓存:结合<keep-alive>对需要缓存的路由进行标记。

标签: 路由权限
分享给朋友:

相关文章

vue实现路由跳转

vue实现路由跳转

Vue 路由跳转的实现方式 在 Vue 中,路由跳转可以通过 vue-router 实现,以下是几种常见的方法: 声明式导航(模板中使用 <router-link>) 通过 <ro…

vue路由可以实现什么

vue路由可以实现什么

Vue 路由的核心功能 Vue Router 是 Vue.js 官方的路由管理器,主要用于构建单页面应用(SPA)。它通过管理 URL 与组件的映射关系,实现页面间的无刷新跳转。 路由的基本实现 动…

vue路由怎么实现

vue路由怎么实现

Vue 路由实现方法 Vue 路由通常通过 vue-router 库实现,以下是具体实现步骤: 安装 vue-router 在项目中运行以下命令安装 vue-router: npm install…

vue实现hash路由

vue实现hash路由

vue实现hash路由的基本原理 Vue实现hash路由主要依赖浏览器原生的hashchange事件和Vue的响应式系统。hash路由通过监听URL中#后面的变化来切换页面内容,无需向服务器发起请求。…

uniapp 路由插件

uniapp 路由插件

在UniApp中,路由管理通常依赖框架内置的页面跳转API,但若需要更高级的路由功能(如动态路由、拦截器等),可通过以下插件或方案实现: 路由插件推荐 uni-simple-router 专为Uni…

vue实现动态路由讲解

vue实现动态路由讲解

动态路由的基本概念 动态路由允许根据用户权限、业务需求等条件动态加载路由配置,常用于权限控制或模块化开发。Vue Router 提供了 addRoute 方法实现动态添加路由。 实现动态路由的步骤…