当前位置:首页 > 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 集中管理权限状态:

vue前端实现权限

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>

权限工具函数

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

vue前端实现权限

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')
  }
})

动态菜单实现

根据权限生成导航菜单:

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

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

相关文章

vue实现弹窗可切换

vue实现弹窗可切换

实现弹窗可切换的 Vue 方案 动态组件切换 通过 Vue 的 <component :is="currentComponent"> 动态加载不同弹窗组件,结合 v-if 控制显示状态。…

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-fo…

vue实现返回

vue实现返回

返回按钮功能实现 在Vue中实现返回功能通常有两种方式:使用浏览器历史记录的history.back()或结合Vue Router进行编程式导航。以下是具体实现方法: 使用浏览器API met…

vue实现toggle

vue实现toggle

Vue 实现 Toggle 功能 在 Vue 中实现 toggle(切换)功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 和 v-on 通过 v-model 绑定数据,结合…

vue实现前端

vue实现前端

Vue 实现前端的核心方法与步骤 安装 Vue 项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 是传统构建工具,Vite 是新一代轻量级工具。 npm init vue@la…