当前位置:首页 > VUE

vue实现权限

2026-03-07 16:56:27VUE

Vue 实现权限控制的常见方法

基于路由的权限控制

在 Vue 项目中,可以使用路由守卫(navigation guards)来控制用户访问权限。在路由配置中为每个路由添加 meta 字段,定义访问该路由所需的权限。

const router = new VueRouter({
  routes: [
    {
      path: '/admin',
      component: AdminPanel,
      meta: { requiresAuth: true, roles: ['admin'] }
    }
  ]
})

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

组件级权限控制

创建自定义指令 v-permission,用于控制组件显示。在全局注册该指令,根据用户权限决定是否渲染组件。

Vue.directive('permission', {
  inserted: function(el, binding, vnode) {
    const permissions = vnode.context.$store.getters.permissions
    if (!permissions.includes(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

// 使用方式
<button v-permission="'user:create'">创建用户</button>

动态菜单生成

根据用户权限动态生成可访问的菜单列表。在 Vuex 中存储用户权限信息,通过计算属性过滤出有权限访问的菜单项。

computed: {
  accessibleMenus() {
    const allMenus = this.$store.state.menus
    const userPermissions = this.$store.state.user.permissions
    return allMenus.filter(menu => {
      return !menu.permission || userPermissions.includes(menu.permission)
    })
  }
}

API 请求权限控制

在请求拦截器中检查权限,没有权限的请求直接拒绝。结合后端 API 返回的 403 状态码处理无权限情况。

axios.interceptors.request.use(config => {
  const requiredPermission = config.meta?.permission
  if (requiredPermission && !store.getters.hasPermission(requiredPermission)) {
    return Promise.reject(new Error('无权限访问'))
  }
  return config
})

权限数据管理

使用 Vuex 集中管理权限数据,包括用户角色、权限列表等。通过 getters 提供权限检查方法。

const store = new Vuex.Store({
  state: {
    user: {
      roles: [],
      permissions: []
    }
  },
  getters: {
    hasPermission: state => permission => {
      return state.user.permissions.includes(permission)
    }
  }
})

按钮级权限控制

创建权限检查混合(mixin),在组件中复用权限检查逻辑。对于按钮等细粒度权限控制特别有用。

const permissionMixin = {
  methods: {
    checkPermission(permission) {
      return this.$store.getters.hasPermission(permission)
    }
  }
}

// 使用方式
<template>
  <button v-if="checkPermission('user:delete')">删除</button>
</template>

权限初始化流程

在用户登录成功后,获取并存储权限数据。通常在应用初始化时从服务器获取权限信息。

vue实现权限

async login() {
  const res = await api.login(this.form)
  this.$store.commit('SET_USER', res.data.user)
  this.$store.commit('SET_PERMISSIONS', res.data.permissions)
  this.$router.push('/')
}

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

相关文章

vue实现购票

vue实现购票

Vue 实现购票功能 数据结构设计 购票功能通常需要以下数据结构: 场次信息(时间、地点、价格) 座位信息(可选座位、已售座位) 用户订单信息 示例数据结构: data() { return…

vue实现刷卡

vue实现刷卡

Vue 实现刷卡效果 在 Vue 中实现刷卡效果可以通过 CSS 动画和 Vue 的过渡系统结合完成。以下是一种常见的实现方式: 基础实现方法 安装 Vue 过渡依赖(如果尚未安装): npm i…

vue实现画板

vue实现画板

Vue 实现画板功能 在 Vue 中实现画板功能可以通过 HTML5 的 Canvas API 实现。以下是一个完整的实现方案: 创建 Vue 组件 新建一个 Vue 单文件组件(SFC),命名为…

vue实现烟花

vue实现烟花

Vue 实现烟花效果 在 Vue 中实现烟花效果可以通过结合 CSS 动画和 JavaScript 动态生成烟花元素。以下是具体实现方法: 动态生成烟花元素 通过 Vue 的 v-for 动态生成烟…

vue指令实现权限

vue指令实现权限

vue指令实现权限控制 权限控制在Vue项目中可以通过自定义指令实现,主要分为全局指令和局部指令两种方式。以下是一个完整的实现方案: 全局权限指令实现 在main.js或单独的文件中定义全局指令:…

vue打包实现推送

vue打包实现推送

Vue 项目打包与自动化部署推送 打包 Vue 项目 使用以下命令生成生产环境代码,默认输出到 dist 目录: npm run build 配置自动化推送(以 GitHub Pages 为例)…