当前位置:首页 > VUE

vue权限管理实现

2026-01-19 09:43:20VUE

Vue 权限管理实现方案

基于路由的动态权限控制

router/index.js中定义静态路由和动态路由,通过addRoute方法动态添加路由。结合后端返回的权限标识过滤路由表:

// 示例:过滤动态路由
function filterAsyncRoutes(routes, roles) {
  return routes.filter(route => {
    if (hasPermission(roles, route)) {
      if (route.children) {
        route.children = filterAsyncRoutes(route.children, roles)
      }
      return true
    }
    return false
  })
}

全局权限指令实现

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

// directives/permission.js
export default {
  inserted(el, binding, vnode) {
    const { value } = binding
    const permissions = store.getters && store.getters.permissions

    if (value && value instanceof Array && value.length > 0) {
      const hasPermission = permissions.some(perm => {
        return value.includes(perm)
      })

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
}

按钮级权限控制

在组件中使用权限判断方法控制按钮显示:

vue权限管理实现

<template>
  <button v-if="checkPermission(['admin'])">管理员按钮</button>
</template>

<script>
export default {
  methods: {
    checkPermission(perms) {
      return this.$store.getters.permissions.some(p => perms.includes(p))
    }
  }
}
</script>

菜单权限过滤

根据用户权限过滤导航菜单数据:

// utils/permission.js
export function filterMenus(menus, permissions) {
  return menus.filter(menu => {
    if (menu.meta && menu.meta.permissions) {
      return menu.meta.permissions.some(p => permissions.includes(p))
    }
    return true
  })
}

权限数据持久化

使用vuex-persistedstate插件保持权限状态:

vue权限管理实现

// store/index.js
import createPersistedState from 'vuex-persistedstate'

export default new Vuex.Store({
  plugins: [createPersistedState({
    key: 'auth',
    paths: ['permissions', 'roles']
  })]
})

接口权限拦截

在axios拦截器中验证API权限:

// utils/request.js
service.interceptors.request.use(config => {
  const permission = store.getters.permissions
  if (config.url.includes('/admin/') && !permission.includes('admin')) {
    return Promise.reject(new Error('无权限访问'))
  }
  return config
})

权限初始化流程

在应用入口文件完成权限初始化:

// main.js
router.beforeEach(async (to, from, next) => {
  if (!store.getters.permissions.length) {
    const { permissions } = await store.dispatch('user/getInfo')
    const accessRoutes = await store.dispatch('permission/generateRoutes', permissions)
    router.addRoutes(accessRoutes)
    next({ ...to, replace: true })
  } else {
    next()
  }
})

权限数据格式示例

建议的权限数据结构:

{
  "roles": ["editor"],
  "permissions": ["article:edit", "user:view"],
  "menus": [
    {
      "path": "/articles",
      "meta": { "permissions": ["article:view"] }
    }
  ]
}

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

相关文章

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用于…

vue 实现权限

vue 实现权限

Vue 实现权限控制的方法 在 Vue 项目中实现权限控制通常涉及前端路由、组件和按钮级别的权限管理。以下是几种常见的实现方式: 路由权限控制 通过路由守卫实现权限验证,过滤用户无权访问的路由:…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

vue代理实现

vue代理实现

Vue 代理实现方法 在 Vue 项目中,配置代理可以解决开发环境下的跨域问题,通常通过修改 vue.config.js 文件实现。以下是几种常见的代理配置方式: 基础代理配置 在 vue.conf…