当前位置:首页 > VUE

vue element 实现权限

2026-03-28 22:31:50VUE

Vue + Element UI 实现权限控制

路由权限控制

  1. 定义路由元信息 在路由配置中添加 meta 字段标记权限标识:

    {
    path: '/admin',
    component: AdminPage,
    meta: { requiresAuth: true, permission: 'admin' }
    }
  2. 全局路由守卫 通过 beforeEach 钩子进行拦截:

    router.beforeEach((to, from, next) => {
    const hasPermission = store.getters.permissions.includes(to.meta.permission)
    if (to.matched.some(record => record.meta.requiresAuth) && !hasPermission) {
     next('/403')
    } else {
     next()
    }
    })

动态菜单生成

  1. 过滤有权限的路由

    const filterRoutes = (routes, permissions) => {
    return routes.filter(route => {
     if (route.meta && route.meta.permission) {
       return permissions.includes(route.meta.permission)
     }
     return true
    })
    }
  2. 侧边栏菜单渲染 在导航组件中结合 el-menu 动态渲染:

    <el-menu :router="true">
    <template v-for="item in allowedRoutes">
     <el-submenu v-if="item.children" :index="item.path">
       <template #title>{{ item.meta.title }}</template>
       <el-menu-item 
         v-for="child in item.children" 
         :key="child.path" 
         :index="child.path"
       >
         {{ child.meta.title }}
       </el-menu-item>
     </el-submenu>
     <el-menu-item v-else :index="item.path">
       {{ item.meta.title }}
     </el-menu-item>
    </template>
    </el-menu>

按钮级权限控制

  1. 自定义指令实现 创建 v-permission 指令:

    Vue.directive('permission', {
    inserted(el, binding, vnode) {
     const { value } = binding
     const permissions = vnode.context.$store.getters.permissions
    
     if (value && !permissions.includes(value)) {
       el.parentNode && el.parentNode.removeChild(el)
     }
    }
    })
  2. 组件中使用指令

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

API 权限拦截

  1. 请求拦截器配置 在 axios 拦截器中验证权限:
    axios.interceptors.request.use(config => {
    const requiredPermission = config.headers['X-Required-Permission']
    if (requiredPermission && !store.getters.permissions.includes(requiredPermission)) {
     return Promise.reject(new Error('无访问权限'))
    }
    return config
    })

权限数据管理

  1. Vuex 存储方案
    const store = new Vuex.Store({
    state: {
     permissions: []
    },
    mutations: {
     SET_PERMISSIONS(state, permissions) {
       state.permissions = permissions
     }
    },
    actions: {
     async fetchPermissions({ commit }) {
       const res = await getPermissionsAPI()
       commit('SET_PERMISSIONS', res.data)
     }
    }
    })

页面元素动态显示

  1. 函数式权限判断

    methods: {
    hasPermission(permission) {
     return this.$store.getters.permissions.includes(permission)
    }
    }
  2. 模板中使用

    vue element 实现权限

    <el-tab-pane v-if="hasPermission('report:view')" label="报表"></el-tab-pane>

注意事项

  1. 权限标识应保持唯一性,建议采用 模块:操作 的命名方式
  2. 后端接口必须同步进行权限验证
  3. 初始加载时应先获取用户权限数据
  4. 无权限访问时应当返回 403 页面而非直接隐藏路由
  5. 生产环境建议配合 JWT 等认证机制使用

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

相关文章

vue实现帖子

vue实现帖子

Vue 实现帖子功能 使用 Vue 实现帖子功能需要结合前端框架和后端数据交互,以下是实现的关键步骤和代码示例。 帖子列表展示 创建帖子列表组件,使用 v-for 渲染帖子数据,通过 axios 获…

vue实现录像

vue实现录像

Vue 实现录像功能 在 Vue 中实现录像功能通常需要借助浏览器的 MediaDevices API 和 MediaRecorder API。以下是实现步骤: 获取用户摄像头和麦克风权限 使用 n…

vue实现ide

vue实现ide

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

vue 实现平面

vue 实现平面

Vue 实现平面的方法 在 Vue 中实现平面效果通常涉及 CSS 样式、UI 框架或自定义组件的使用。以下是几种常见方法: 使用 CSS 样式 通过 Vue 的样式绑定或 scoped CSS 为…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue实现dialog

vue实现dialog

Vue 实现 Dialog 的方法 使用 Vue 原生组件实现 Vue 可以通过组件化的方式实现 Dialog,以下是一个简单的实现示例: <template> <div>…