当前位置:首页 > 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 的响应式系统无法直接检测到数组的某些变化,因为 JavaScript 的限制。以下是一些解决方案: 使用 Vue.set 或 this.$set Vue 提供…

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue单页面实现登录

vue单页面实现登录

实现登录功能的基本流程 在Vue单页面应用中实现登录功能,通常需要以下几个关键步骤: 创建登录表单组件 使用Vue的模板语法创建包含用户名和密码输入框的表单,并绑定数据到组件的data属性。 <…

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录…

vue实现本地数据存储

vue实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…