当前位置:首页 > VUE

vue前端实现权限

2026-01-14 23:31:22VUE

Vue 前端权限实现方案

路由权限控制

使用 Vue Router 的全局前置守卫 beforeEach 进行路由拦截,结合用户的权限列表过滤可访问路由。

router.beforeEach((to, from, next) => {
  const hasPermission = checkPermission(to.meta.requiredPermission)
  if (hasPermission) {
    next()
  } else {
    next('/forbidden')
  }
})

动态生成路由表时,根据用户权限过滤路由配置:

function filterRoutes(allRoutes, userPermissions) {
  return allRoutes.filter(route => {
    return userPermissions.includes(route.meta.permission)
  })
}

组件级权限控制

创建自定义指令 v-permission 控制组件显示:

Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const permissions = store.getters.permissions

    if (!permissions.includes(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

在模板中使用:

<button v-permission="'user:delete'">删除用户</button>

API 请求权限控制

在请求拦截器中检查权限:

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

权限数据管理

使用 Vuex 集中管理权限状态:

const store = new Vuex.Store({
  state: {
    permissions: []
  },
  mutations: {
    setPermissions(state, permissions) {
      state.permissions = permissions
    }
  },
  actions: {
    async fetchPermissions({ commit }) {
      const res = await getPermissions()
      commit('setPermissions', res.data)
    }
  }
})

按钮级权限组件

创建权限组件封装逻辑:

Vue.component('Permission', {
  props: {
    value: {
      type: [String, Array],
      required: true
    }
  },
  render() {
    const hasPermission = checkPermission(this.value)
    return hasPermission ? this.$slots.default : null
  }
})

使用方式:

<permission :value="'user:edit'">
  <button>编辑用户</button>
</permission>

权限工具函数

实现通用的权限检查方法:

function checkPermission(requiredPermission, userPermissions) {
  if (Array.isArray(requiredPermission)) {
    return requiredPermission.some(perm => 
      userPermissions.includes(perm)
    )
  }
  return userPermissions.includes(requiredPermission)
}

初始化流程

用户登录后获取权限并初始化:

async function initPermission() {
  await store.dispatch('fetchPermissions')
  const accessedRoutes = filterRoutes(asyncRoutes, store.state.permissions)
  router.addRoutes(accessedRoutes)
}

权限数据结构示例

后端返回的权限数据格式建议:

{
  "permissions": [
    "user:create",
    "user:read",
    "user:update",
    "role:assign"
  ]
}

错误处理

无权限访问的统一处理:

router.onError(error => {
  if (error.message.includes('Permission denied')) {
    router.push('/forbidden')
  }
})

动态菜单实现

根据权限生成导航菜单:

vue前端实现权限

computed: {
  menuItems() {
    return this.allMenuItems.filter(item => 
      this.$store.getters.hasPermission(item.permission)
    )
  }
}

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

相关文章

vue全选实现

vue全选实现

Vue 全选实现方法 在 Vue 中实现全选功能通常涉及数据绑定和事件处理。以下是几种常见的实现方式: 基础实现方式 <template> <div> <…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…

vue实现答辩

vue实现答辩

Vue 实现答辩系统的关键步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目,安装 Vue Router 管理路由,Pinia/Vuex 进行状态管理。配置 ESLint 和 Pre…

vue nexttick实现

vue nexttick实现

Vue 中 nextTick 的实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它的核心实现依赖于 JavaScript 的事件循环机制。 基本…

vue实现datalist

vue实现datalist

使用 Vue 实现 HTML5 的 datalist 功能 HTML5 的 <datalist> 元素提供了一种自动完成输入框的功能,允许用户在输入时从预定义的选项列表中选择。以下是几种在…