当前位置:首页 > VUE

权限 vue组件 实现

2026-02-20 05:18:18VUE

权限 Vue 组件实现方法

基于路由的权限控制

在 Vue 项目中可以通过路由守卫实现权限控制。在路由配置中为每个路由添加 meta 字段,定义访问该路由所需的权限。

const routes = [
  {
    path: '/admin',
    component: AdminPanel,
    meta: { requiresAuth: true, roles: ['admin'] }
  },
  {
    path: '/user',
    component: UserDashboard,
    meta: { requiresAuth: true, roles: ['user', 'admin'] }
  }
]

在全局前置守卫中检查用户权限:

router.beforeEach((to, from, next) => {
  const currentUser = store.state.user
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)

  if (requiresAuth && !currentUser) {
    next('/login')
  } else if (requiresAuth && !hasPermission(to.meta.roles, currentUser.roles)) {
    next('/403')
  } else {
    next()
  }
})

指令式权限控制

创建自定义指令 v-permission,用于控制DOM元素的显示:

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

    if (value && value instanceof Array && value.length > 0) {
      const hasPermission = roles.some(role => value.includes(role))

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error('需要指定权限数组')
    }
  }
})

使用方式:

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

组件式权限控制

创建可复用的权限组件:

权限 vue组件 实现

<template>
  <div v-if="checkPermission">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'Permission',
  props: {
    required: {
      type: Array,
      required: true
    }
  },
  computed: {
    checkPermission() {
      const roles = this.$store.getters.roles
      return this.required.some(role => roles.includes(role))
    }
  }
}
</script>

使用方式:

<permission :required="['admin']">
  <admin-panel></admin-panel>
</permission>

权限数据管理

在Vuex中管理权限状态:

const store = new Vuex.Store({
  state: {
    user: null,
    permissions: []
  },
  mutations: {
    SET_USER(state, user) {
      state.user = user
      state.permissions = user.permissions
    }
  },
  getters: {
    roles: state => state.user ? state.user.roles : [],
    permissions: state => state.permissions
  }
})

动态菜单生成

根据权限动态生成侧边栏菜单:

权限 vue组件 实现

computed: {
  accessibleRoutes() {
    return this.routes.filter(route => {
      if (!route.meta || !route.meta.roles) return true
      return route.meta.roles.some(role => this.userRoles.includes(role))
    })
  }
}

按钮级权限控制

创建权限判断方法,用于细粒度控制:

methods: {
  hasPermission(permission) {
    return this.$store.getters.permissions.includes(permission)
  }
}

模板中使用:

<button v-if="hasPermission('user:delete')">删除用户</button>

服务端权限验证

即使前端实现了权限控制,仍需服务端验证:

async function checkPermission() {
  try {
    const res = await axios.get('/api/check-permission', {
      params: { requiredPermission: 'user:delete' }
    })
    return res.data.hasPermission
  } catch (error) {
    console.error('权限检查失败', error)
    return false
  }
}

这些方法可以组合使用,根据项目需求选择适合的权限控制方案。路由级控制适合页面访问权限,指令和组件适合UI元素控制,服务端验证确保安全性。

标签: 组件权限
分享给朋友:

相关文章

vue实现下拉框组件

vue实现下拉框组件

基础下拉框实现 使用Vue的v-model和v-for指令实现基础下拉框: <template> <select v-model="selectedOption">…

vue实现权限管理

vue实现权限管理

Vue 权限管理实现方案 权限管理通常分为路由权限和功能权限两部分,以下是常见的实现方式: 路由权限控制 动态路由加载 通过用户角色或权限标识动态生成可访问的路由表。在路由守卫中校验权限: //…

vue抽屉组件实现

vue抽屉组件实现

Vue 抽屉组件实现 使用 Element UI 实现 Element UI 提供了现成的抽屉组件 el-drawer,可以快速实现抽屉效果。 安装 Element UI: npm install…

vue 实现弹窗组件

vue 实现弹窗组件

Vue 弹窗组件实现 基础弹窗组件结构 创建一个名为Modal.vue的文件,定义弹窗的基础结构和样式: <template> <div class="modal-mask"…

vue实现路由组件

vue实现路由组件

Vue 实现路由组件的方法 在 Vue 中实现路由功能通常需要结合 Vue Router 库,以下是具体实现步骤: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Router…

vue实现列表组件

vue实现列表组件

Vue 列表组件实现方法 基础列表渲染 使用 v-for 指令渲染数组数据,需配合 :key 提升性能: <template> <ul> <li v-for…