当前位置:首页 > VUE

vue的权限控制实现

2026-02-21 03:03:06VUE

路由级权限控制

路由级权限控制通常通过Vue Router的导航守卫实现。在路由配置中为每个路由添加meta字段定义所需权限:

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

在全局前置守卫中校验权限:

router.beforeEach((to, from, next) => {
  const userRoles = store.getters.roles
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login')
  } else if (to.meta.roles && !hasPermission(userRoles, to.meta.roles)) {
    next('/403')
  } else {
    next()
  }
})

组件级权限控制

使用自定义指令v-permission控制组件渲染:

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

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

组件中使用方式:

<button v-permission="['admin']">删除</button>

按钮级权限控制

创建权限校验函数并混入到Vue实例:

vue的权限控制实现

Vue.mixin({
  methods: {
    $hasPermission(requiredRoles) {
      const userRoles = this.$store.getters.roles
      return requiredRoles.some(role => userRoles.includes(role))
    }
  }
})

模板中使用:

<button v-if="$hasPermission(['admin'])">管理</button>

动态菜单权限

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

function filterAsyncRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role))
    }
    return true
  })
}

权限数据管理

使用Vuex集中管理权限状态:

vue的权限控制实现

const store = new Vuex.Store({
  state: {
    roles: []
  },
  mutations: {
    SET_ROLES(state, roles) {
      state.roles = roles
    }
  },
  actions: {
    async fetchRoles({ commit }) {
      const roles = await api.getRoles()
      commit('SET_ROLES', roles)
    }
  }
})

服务端校验

前端实现需配合服务端校验:

axios.interceptors.response.use(response => {
  return response
}, error => {
  if (error.response.status === 403) {
    router.push('/403')
  }
  return Promise.reject(error)
})

权限指令扩展

支持权限模式配置的增强指令:

Vue.directive('permission', {
  inserted(el, binding) {
    const { value, modifiers } = binding
    const hasAuth = checkPermission(value)

    if (!hasAuth) {
      if (modifiers.disable) {
        el.disabled = true
      } else {
        el.parentNode?.removeChild(el)
      }
    }
  }
})

使用方式:

<button v-permission.disable="'create'">创建</button>

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

相关文章

vue架构实现

vue架构实现

Vue 架构实现核心方案 Vue.js 的架构实现通常围绕模块化、组件化和状态管理展开。以下为常见实现方案: 基于单文件组件(SFC)的模块化 通过 .vue 文件组织模板、脚本和样式: <…

vue实现vnc

vue实现vnc

Vue 实现 VNC 客户端 在 Vue 项目中实现 VNC 客户端功能,可以通过集成现有的 VNC 客户端库或组件完成。以下是具体实现方法: 安装依赖库 使用 noVNC 或其他 VNC 客户端…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

vue实现popup

vue实现popup

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

vue 实现报价

vue 实现报价

Vue 实现报价功能 在 Vue 中实现报价功能通常涉及前端表单交互、数据计算和与后端 API 的通信。以下是实现报价功能的几种常见方法: 表单设计与数据绑定 使用 Vue 的 v-model 指…

vue实现反馈

vue实现反馈

Vue 实现反馈功能的方法 在 Vue 中实现反馈功能可以通过多种方式,包括弹窗提示、Toast 消息、表单提交等。以下是几种常见的实现方法。 弹窗反馈 使用 Vue 的组件化特性创建一个弹窗组件,…