当前位置:首页 > VUE

vue权限实现

2026-01-12 18:32:20VUE

Vue 权限实现方案

在 Vue 项目中实现权限控制通常涉及前端路由、按钮/组件级权限、动态菜单等方面。以下是几种常见的实现方式:

基于路由的权限控制

通过路由守卫拦截未授权访问,结合动态路由添加实现:

// router/index.js
router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  const userRoles = store.getters.roles // 假设从Vuex获取用户角色

  if (to.meta.requiresAuth && !hasToken) {
    next('/login')
  } else if (to.meta.roles && !to.meta.roles.includes(userRoles)) {
    next('/403') // 无权限页面
  } else {
    next()
  }
})

动态添加路由示例:

// 过滤异步路由表
function filterAsyncRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role))
    } else {
      return true
    }
  })
}

指令式按钮权限控制

通过自定义指令实现按钮级权限:

// main.js
Vue.directive('permission', {
  inserted(el, binding) {
    const { value } = binding
    const permissions = store.getters.permissions

    if (value && !permissions.includes(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

使用方式:

<button v-permission="'user:delete'">删除用户</button>

组件级权限控制

封装权限校验组件:

// components/Permission.vue
export default {
  props: {
    required: {
      type: [String, Array],
      required: true
    }
  },
  computed: {
    hasPermission() {
      const userPermissions = this.$store.getters.permissions
      return Array.isArray(this.required) 
        ? this.required.every(p => userPermissions.includes(p))
        : userPermissions.includes(this.required)
    }
  },
  render() {
    return this.hasPermission ? this.$slots.default : null
  }
}

使用方式:

<permission :required="['user:edit', 'user:view']">
  <button>编辑用户</button>
</permission>

权限数据管理方案

  1. 权限数据结构

    // 后端返回的权限数据示例
    {
    "roles": ["admin"],
    "permissions": ["user:add", "user:delete"],
    "menus": [
     {
       "path": "/user",
       "meta": { "title": "用户管理" }
     }
    ]
    }
  2. Vuex存储方案

    // store/modules/permission.js
    export default {
    state: {
     roles: [],
     permissions: [],
     routes: []
    },
    mutations: {
     SET_ROLES(state, roles) {
       state.roles = roles
     },
     SET_PERMISSIONS(state, permissions) {
       state.permissions = permissions
     },
     SET_ROUTES(state, routes) {
       state.routes = routes
     }
    }
    }

动态菜单实现

根据权限生成菜单的两种方式:

  1. 前端过滤

    function filterMenus(menus, permissions) {
    return menus.filter(menu => {
     if (menu.children) {
       menu.children = filterMenus(menu.children, permissions)
     }
     return !menu.meta?.permission || permissions.includes(menu.meta.permission)
    })
    }
  2. 后端返回

    // 登录后获取菜单数据
    async function getMenus() {
    const { data } = await api.getMenus()
    commit('SET_ROUTES', data)
    // 动态添加路由
    data.forEach(route => {
     router.addRoute(route)
    })
    }

最佳实践建议

  • 权限校验应前后端配合,前端控制展示层,后端校验关键操作
  • 敏感路由建议在后端进行二次校验
  • 使用路由元信息(meta)存储权限标记
  • 权限变更时需清除缓存并重新获取权限数据
  • 生产环境建议将权限数据加密存储

以上方案可根据项目需求组合使用,中小型项目通常采用路由守卫+指令方式即可满足需求,复杂系统可能需要完整的动态路由+菜单方案。

vue权限实现

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

相关文章

vue实现检测数组

vue实现检测数组

Vue 中检测数组变化的方法 Vue 的响应式系统无法直接检测到数组的某些变化,因为 JavaScript 的限制。以下是一些解决方案: 使用 Vue.set 或 this.$set Vue 提供…

vue实现头像剪切

vue实现头像剪切

Vue 实现头像剪切的实现方法 使用 vue-cropperjs 库 vue-cropperjs 是一个基于 cropperjs 的 Vue 组件,专门用于图片裁剪。安装方式如下: npm ins…

vue实现选择季度

vue实现选择季度

Vue 实现选择季度的几种方法 使用下拉选择框(Select) 在 Vue 中可以通过 v-model 绑定一个下拉选择框来实现季度选择。数据可以预先定义为一个包含季度选项的数组。 <tem…

vue怎么实现动画

vue怎么实现动画

Vue 动画实现方法 Vue 提供了多种方式实现动画效果,包括内置过渡系统、第三方库集成以及 CSS 动画。以下是常见实现方法: 使用 Vue 过渡系统 通过 <transition>…

vue实现购物按钮

vue实现购物按钮

Vue 购物按钮实现方法 基础按钮实现 使用 Vue 的模板语法创建基础按钮组件,绑定点击事件处理购物逻辑: <template> <button @click="addToC…

vue实现好评弹框

vue实现好评弹框

Vue 实现好评弹框的方法 使用 Vue 实现好评弹框可以通过组件化方式完成,结合动态数据绑定和事件处理。以下是具体实现步骤: 1. 创建弹框组件 新建一个 RatingDialog.vue…