当前位置:首页 > VUE

vue 实现权限管理

2026-03-10 03:48:39VUE

路由权限控制

通过Vue Router的全局守卫beforeEach实现路由拦截,结合用户角色动态过滤可访问路由表。定义基础路由和动态路由,动态路由根据后端返回的角色权限数据动态添加。

// router.js
const dynamicRoutes = [
  { path: '/admin', component: Admin, meta: { roles: ['admin'] } },
  { path: '/editor', component: Editor, meta: { roles: ['editor'] } }
]

router.beforeEach((to, from, next) => {
  const userRole = store.getters.role
  if (to.meta?.roles && !to.meta.roles.includes(userRole)) {
    next('/403')
  } else {
    next()
  }
})

菜单权限控制

基于用户权限动态生成导航菜单,使用v-if或自定义指令控制菜单项显示。建议将权限数据与菜单配置分离,通过权限码映射关系实现控制。

<template>
  <el-menu>
    <el-submenu 
      v-for="menu in filteredMenus" 
      :key="menu.path"
      v-permission="menu.permission"
    >
      <!-- 菜单内容 -->
    </el-submenu>
  </el-menu>
</template>

<script>
export default {
  computed: {
    filteredMenus() {
      return this.menus.filter(menu => 
        this.$store.getters.permissions.includes(menu.permission)
      )
    }
  }
}
</script>

按钮级权限控制

自定义指令v-permission实现按钮粒度控制,或使用权限判断函数包裹按钮组件。指令内部通过比对权限码列表决定是否渲染DOM。

vue 实现权限管理

// directives.js
Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const permissions = vnode.context.$store.getters.permissions
    if (!permissions.includes(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

API权限控制

在请求拦截器中添加权限校验,对无权限的请求直接拦截。建议与后端约定状态码,前端统一处理403状态。

// axios.interceptors.request.use
const apiPermissionMap = {
  '/delete': 'delete_permission'
}

service.interceptors.request.use(config => {
  const requiredPerm = apiPermissionMap[config.url]
  if (requiredPerm && !store.getters.permissions.includes(requiredPerm)) {
    return Promise.reject(new Error('无操作权限'))
  }
  return config
})

权限数据管理

使用Vuex集中管理权限数据,包含角色信息、权限列表等。通过action异步获取权限数据,getter提供快捷访问。

vue 实现权限管理

// store/modules/permission.js
const state = {
  roles: [],
  permissions: []
}

const actions = {
  async getPermissions({ commit }) {
    const res = await api.getPermissions()
    commit('SET_PERMISSIONS', res.data)
  }
}

动态路由加载

利用router.addRoutes实现路由动态注册,结合后端返回的权限数据过滤出有效路由。注意404路由需最后添加。

// 过滤动态路由
function filterRoutes(routes, permissions) {
  return routes.filter(route => {
    if (route.meta?.permission) {
      return permissions.includes(route.meta.permission)
    }
    return true
  })
}

权限指令扩展

对于复杂场景可扩展指令功能,支持权限组合校验(AND/OR逻辑),通过修饰符指定校验模式。

Vue.directive('permission', {
  inserted(el, binding) {
    const { value, modifiers } = binding
    const hasPermission = checkPermission(value, modifiers)
    if (!hasPermission) el.parentNode && el.parentNode.removeChild(el)
  }
})

function checkPermission(value, modifiers) {
  // 实现AND/OR逻辑判断
}

权限变更处理

监听权限变化事件,当检测到权限变更时重新初始化路由和菜单。典型场景包括角色切换、权限刷新等。

watch: {
  '$store.getters.permissions'(newVal) {
    this.initRoutes()
    this.generateMenu()
  }
}

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

相关文章

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue实现erp

vue实现erp

Vue实现ERP系统的关键步骤 技术选型与架构设计 采用Vue 3 + TypeScript构建前端,搭配Pinia状态管理,Element Plus或Ant Design Vue作为UI框架。后端可…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…

vue实现注册

vue实现注册

Vue 实现注册功能 注册功能通常涉及前端表单、数据验证、与后端 API 的交互等步骤。以下是一个完整的 Vue 实现注册功能的方案。 创建注册表单 使用 Vue 的模板语法创建注册表单,包含用户名…

vue实现 弹窗

vue实现 弹窗

Vue 实现弹窗的基本方法 使用 Vue 实现弹窗可以通过多种方式,包括组件化、指令、插件等。以下是几种常见的实现方法。 组件化实现弹窗 创建一个独立的弹窗组件,通过 props 控制显示与隐藏。…

vue 实现vshow

vue 实现vshow

Vue 实现 v-show 在 Vue 中,v-show 是一个常用的指令,用于根据条件控制元素的显示或隐藏。与 v-if 不同,v-show 不会移除 DOM 元素,而是通过 CSS 的 displ…