当前位置:首页 > VUE

vue实现前端权限

2026-03-29 06:54:14VUE

Vue 前端权限实现方案

前端权限控制通常分为路由权限和功能权限两部分,以下是常见的实现方法:

路由权限控制

动态路由方案 通过用户登录后获取的权限数据动态生成可访问路由表,使用 router.addRoutes 方法添加权限路由:

// 在路由守卫中处理动态路由
router.beforeEach(async (to, from, next) => {
  const hasToken = localStorage.getItem('token')
  if (hasToken) {
    if (to.path === '/login') {
      next('/')
    } else {
      const hasRoles = store.getters.roles.length > 0
      if (hasRoles) {
        next()
      } else {
        try {
          const { roles } = await store.dispatch('user/getInfo')
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })
        } catch (error) {
          await store.dispatch('user/resetToken')
          next(`/login?redirect=${to.path}`)
        }
      }
    }
  } else {
    /* 无token处理逻辑 */
  }
})

路由元信息控制 在路由配置中使用 meta 字段标记权限要求:

{
  path: '/admin',
  component: Layout,
  meta: {
    roles: ['admin']
  }
}

功能权限控制

指令式权限控制 创建自定义指令 v-permission 控制元素显示:

Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const roles = store.getters.roles
    if (value && value instanceof Array && value.length > 0) {
      const hasPermission = roles.some(role => value.includes(role))
      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
})

组件式权限控制 创建权限校验组件:

<template>
  <div v-if="checkPermission()">
    <slot />
  </div>
</template>

<script>
export default {
  props: {
    permission: {
      type: Array,
      required: true
    }
  },
  methods: {
    checkPermission() {
      return this.permission.some(item => this.$store.getters.roles.includes(item))
    }
  }
}
</script>

权限数据管理

权限数据结构示例 典型后端返回的权限数据结构:

{
  "roles": ["admin"],
  "permissions": [
    "user:add",
    "user:delete"
  ],
  "menus": [
    "/dashboard",
    "/user/list"
  ]
}

Vuex 存储方案 在 Vuex 中管理权限状态:

const state = {
  roles: [],
  permissions: []
}

const mutations = {
  SET_ROLES: (state, roles) => {
    state.roles = roles
  },
  SET_PERMISSIONS: (state, permissions) => {
    state.permissions = permissions
  }
}

按钮级权限控制

方法封装方案 创建权限校验方法:

export function checkPermission(permission) {
  const currentPermissions = store.getters.permissions
  return currentPermissions.includes(permission)
}

使用示例

<el-button 
  v-if="checkPermission('user:add')"
  type="primary"
  @click="handleAdd"
>新增用户</el-button>

权限更新处理

权限刷新逻辑 当用户权限变更时需要重新加载权限数据:

vue实现前端权限

async function refreshPermissions() {
  try {
    const { roles, permissions } = await getUserInfo()
    store.commit('SET_ROLES', roles)
    store.commit('SET_PERMISSIONS', permissions)
    const accessRoutes = await generateRoutes(roles)
    resetRouter()
    router.addRoutes(accessRoutes)
  } catch (error) {
    console.error(error)
  }
}

注意事项

  1. 前端权限控制必须与后端验证配合使用,不能单独依赖前端验证
  2. 敏感路由应设置404重定向,防止未授权访问
  3. 权限数据建议存储在Vuex中,避免频繁请求
  4. 动态路由添加后需要处理刷新白屏问题
  5. 按钮权限控制要考虑组件销毁时的内存释放

以上方案可根据实际项目需求组合使用,建议在中等复杂度项目中使用动态路由+指令式权限控制,大型项目可考虑基于RBAC模型的完整权限系统实现。

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

相关文章

实现vue组件

实现vue组件

Vue 组件的基本实现 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种方式: 单文件组件 (SFC) 使用 .vue 文件格式,…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级比…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue实现分发

vue实现分发

Vue 实现分发的方法 在 Vue 中,分发(Distribution)通常指的是将内容从父组件传递到子组件,或者通过插槽(Slots)机制让父组件控制子组件的部分渲染内容。以下是几种常见的实现分发的…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…

vue实现checkbox

vue实现checkbox

Vue 实现 Checkbox 在 Vue 中实现 Checkbox 可以通过原生 HTML 的 <input type="checkbox"> 或使用 Vue 的 v-model 指令绑…