当前位置:首页 > VUE

vue实现动态权限路由

2026-02-23 13:10:20VUE

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

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

  1. 用户登录后获取权限数据(角色或权限标识)
  2. 过滤异步路由表,保留有权限的路由
  3. 将过滤后的路由动态添加到路由器实例

基础路由配置

创建基础路由表,包含无需权限的公共路由:

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'

const publicRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login.vue')
  },
  {
    path: '/404',
    component: () => import('@/views/404.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes: publicRoutes
})

export default router

异步路由表配置

创建需要权限控制的路由表:

// router/asyncRoutes.js
export const asyncRoutes = [
  {
    path: '/dashboard',
    component: () => import('@/views/dashboard.vue'),
    meta: { requiresAuth: true, roles: ['admin'] }
  },
  {
    path: '/user',
    component: () => import('@/views/user.vue'),
    meta: { requiresAuth: true, roles: ['admin', 'editor'] }
  }
]

权限验证逻辑

实现路由过滤函数,根据用户权限筛选可用路由:

// utils/permission.js
export function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role))
    }
    return true
  })
}

动态添加路由

在用户登录后或应用初始化时动态添加路由:

// 通常在登录后或应用初始化时调用
import { asyncRoutes } from './router/asyncRoutes'
import { filterRoutes } from './utils/permission'

function addRoutes(roles) {
  const accessedRoutes = filterRoutes(asyncRoutes, roles)
  accessedRoutes.forEach(route => {
    router.addRoute(route)
  })

  // 添加404通配路由
  router.addRoute({ path: '/:pathMatch(.*)', redirect: '/404' })
}

路由守卫配置

设置全局前置守卫进行权限校验:

// router/index.js
router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.getters.userRoles) {
      next('/login')
    } else {
      const hasPermission = to.matched.some(record => {
        return record.meta.roles?.some(role => 
          store.getters.userRoles.includes(role)
        )
      })
      hasPermission ? next() : next('/403')
    }
  } else {
    next()
  }
})

菜单生成方案

通常需要将过滤后的路由转换为菜单数据:

function generateMenus(routes) {
  return routes.map(route => {
    const menu = {
      path: route.path,
      title: route.meta?.title || '',
      icon: route.meta?.icon || ''
    }
    if (route.children) {
      menu.children = generateMenus(route.children)
    }
    return menu
  })
}

状态管理集成

建议将权限相关数据存储在Vuex或Pinia中:

// store/modules/user.js
export default {
  state: () => ({
    roles: []
  }),
  mutations: {
    SET_ROLES(state, roles) {
      state.roles = roles
    }
  },
  actions: {
    async fetchUserRoles({ commit }) {
      const roles = await api.getUserRoles()
      commit('SET_ROLES', roles)
      return roles
    }
  }
}

完整实现流程

  1. 用户登录成功后获取权限数据
  2. 根据权限数据过滤异步路由表
  3. 使用router.addRoute动态添加过滤后的路由
  4. 将路由数据转换为菜单数据供前端展示
  5. 设置路由守卫进行实时权限校验

注意事项

  • 动态添加的路由不会持久化,刷新页面后需要重新添加
  • 404路由应当最后添加,避免被提前匹配
  • 路由元信息(meta)是存储权限数据的好地方
  • 后端返回的路由数据可能需要转换为Vue Router所需格式

vue实现动态权限路由

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

相关文章

vue实现户籍系统路由实现

vue实现户籍系统路由实现

Vue 实现户籍系统路由方案 户籍系统通常涉及多层级页面和权限控制,以下是基于 Vue Router 的实现方案: 路由模块配置 在 src/router/index.js 中定义路由结构:…

react如何使用路由

react如何使用路由

使用 React Router 的基本方法 React Router 是 React 应用中实现路由功能的核心库。以下是基本使用方法: 安装 React Router 依赖包: npm ins…

react路由如何刷新

react路由如何刷新

React 路由刷新方法 在 React 中,路由刷新通常涉及以下几种场景和解决方案: 强制重新加载当前页面 使用 window.location.reload() 可以强制刷新整个页面,但会丢失…

vue的路由实现

vue的路由实现

Vue 路由的实现方式 Vue 路由通常通过 Vue Router 实现,这是 Vue.js 官方提供的路由管理器。以下是 Vue 路由的核心实现步骤和配置方法。 安装 Vue Router 使用…

vue怎么实现权限

vue怎么实现权限

Vue 权限实现方法 路由权限控制 使用 vue-router 的 beforeEach 钩子进行路由拦截,结合用户角色或权限列表过滤可访问路由。 router.beforeEach((to, f…

vue路由实现流程

vue路由实现流程

Vue 路由实现流程 安装 Vue Router 通过 npm 或 yarn 安装 Vue Router 依赖包: npm install vue-router 或 yarn add vue-ro…