当前位置:首页 > 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…

Vue实现路由监

Vue实现路由监

Vue实现路由监听的方法 在Vue中,可以通过多种方式监听路由变化,以下是常见的实现方法: 使用Vue Router的全局前置守卫 router.beforeEach((to, from,…

vue实现路由导航

vue实现路由导航

Vue 路由导航的实现 Vue 中实现路由导航通常使用 Vue Router 库。以下是具体实现方法: 安装 Vue Router 在项目中安装 Vue Router 依赖: npm instal…

vue实现路由历史

vue实现路由历史

Vue 实现路由历史管理 在 Vue 中,路由历史管理通常通过 Vue Router 实现。Vue Router 提供了两种历史记录模式:hash 模式和 history 模式。以下是具体实现方法。…

vue实现点击跳转路由

vue实现点击跳转路由

vue实现点击跳转路由的方法 在Vue中实现点击跳转路由,可以通过以下几种方式完成,具体取决于项目使用的路由管理工具(如Vue Router)以及需求场景。 使用router-link组件 rou…

权限管理vue如何实现

权限管理vue如何实现

基于路由的权限控制 在Vue中可以通过路由守卫实现页面级权限控制。定义路由时添加meta字段标记权限角色: const routes = [ { path: '/admin',…