当前位置:首页 > 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实现alert

vue实现alert

实现自定义 Alert 组件 在 Vue 中可以通过组件化方式实现自定义 Alert 弹窗。以下是基于 Vue 3 的实现示例: 组件代码 (Alert.vue) <template>…

vue computed 实现

vue computed 实现

computed 的基本用法 在 Vue 中,computed 用于声明计算属性,这些属性基于响应式依赖进行缓存。只有当依赖发生变化时,计算属性才会重新计算。 new Vue({ data: {…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 可以轻松实现单选功能,将单选按钮的值绑定到同…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: npm i…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…

vue实现白板

vue实现白板

Vue实现白板功能 使用Vue实现白板功能可以通过HTML5的Canvas API结合Vue的响应式特性来完成。以下是实现白板功能的关键步骤: 安装依赖 在Vue项目中安装必要的依赖,如vue-dr…