当前位置:首页 > VUE

vue router权限实现

2026-02-19 16:50:00VUE

Vue Router 权限实现方法

在 Vue 应用中实现路由权限控制通常涉及动态路由、导航守卫和用户角色验证。以下是几种常见的实现方式:

基于导航守卫的权限控制

导航守卫(beforeEach)可以在路由跳转前进行权限校验:

router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)

  if (requiresAuth && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

在路由配置中添加元信息标记需要权限的路由:

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { requiresAuth: true }
  }
]

动态路由添加

根据用户权限动态生成可访问的路由表:

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

// 权限路由(动态添加)
const asyncRoutes = [
  { path: '/admin', component: Admin, meta: { roles: ['admin'] } }
]

// 根据用户角色过滤路由
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
  })
}

// 用户登录后添加路由
const allowedRoutes = filterRoutes(asyncRoutes, user.roles)
router.addRoutes(allowedRoutes)

基于权限指令的UI控制

在模板中使用自定义指令控制元素显示:

Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const roles = store.getters.roles

    if (value && value instanceof Array) {
      const hasPermission = roles.some(role => value.includes(role))
      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
})

模板中使用:

<button v-permission="['admin']">管理员按钮</button>

服务端返回路由表

更安全的做法是由服务端返回用户可访问的路由配置:

// 前端请求获取权限路由
api.getUserRoutes().then(routes => {
  const parsedRoutes = parseRoutes(routes) // 解析服务端返回的路由配置
  router.addRoutes(parsedRoutes)
})

路由元信息多级权限

支持更复杂的权限控制场景:

{
  path: '/user',
  component: User,
  meta: {
    permissions: [
      { action: 'read', subject: 'User' },
      { action: 'write', subject: 'User' }
    ]
  }
}

在导航守卫中检查这些权限:

router.beforeEach((to, from, next) => {
  if (to.meta.permissions) {
    const hasPermission = checkPermissions(to.meta.permissions)
    if (!hasPermission) return next('/403')
  }
  next()
})

注意事项

  • 权限验证应该同时在客户端和服务端进行,前端控制只是用户体验优化
  • 动态添加路由后,需要处理404页面的匹配问题
  • 路由权限信息应该与菜单渲染逻辑保持一致
  • 使用Vuex存储权限状态可以方便全局访问

以上方法可以单独使用,也可以组合实现更完善的权限控制系统。根据项目复杂度选择合适的方式,简单项目使用导航守卫即可,复杂系统建议采用动态路由+服务端验证方案。

vue router权限实现

标签: 权限vue
分享给朋友:

相关文章

vue实现原理

vue实现原理

Vue 实现原理 Vue.js 的核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现原理的详细解析: 响应式系统 Vue 2.x 使用 Object.definePr…

vue实现添加用户

vue实现添加用户

Vue 实现添加用户功能 数据绑定与表单设计 在 Vue 中实现添加用户功能,首先需要设计一个表单,用于收集用户输入的数据。通过 v-model 实现双向数据绑定,确保表单数据与 Vue 实例中的数据…

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="w…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…