当前位置:首页 > 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 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式:…

ssh vue 实现

ssh vue 实现

使用SSH连接Vue项目部署的服务器 在Vue项目开发或部署过程中,可能需要通过SSH连接到远程服务器进行配置或维护。以下是实现SSH连接并部署Vue项目的关键步骤: 生成SSH密钥对 在本地终端运…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue 实现树状

vue 实现树状

Vue 实现树状结构的方法 递归组件实现树状结构 递归组件是 Vue 中实现树状结构的常见方法。通过组件自身调用自身,可以轻松构建多层级树状结构。 <template> <ul…

vue实现ide

vue实现ide

Vue 实现 IDE 的基本思路 使用 Vue 构建一个简易的集成开发环境(IDE)需要整合代码编辑器、文件管理、终端模拟等功能。以下是关键实现步骤和推荐工具。 核心功能模块 代码编辑器 使用…