当前位置:首页 > 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' }
    ]
  }
}

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

vue router权限实现

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

注意事项

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

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

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

相关文章

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐藏。…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue实现骰子

vue实现骰子

Vue 实现骰子功能 创建 Vue 组件 在 Vue 项目中创建一个骰子组件,例如 Dice.vue。该组件包含骰子的外观和逻辑。 <template> <div class=…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue实现路径

vue实现路径

Vue 实现路径的方法 在 Vue 中实现路径管理通常涉及 Vue Router 的使用,以下是一些常见的实现方法: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Route…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的position…