当前位置:首页 > 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> <ul&…

实现vue框架

实现vue框架

Vue框架的基本实现 Vue是一个渐进式JavaScript框架,用于构建用户界面。以下是实现Vue框架的基本步骤: 安装Vue 通过CDN引入Vue是最简单的方式: <script src…

vue实现pwa

vue实现pwa

Vue 实现 PWA 的步骤 Vue 结合 PWA(Progressive Web App)可以创建离线可用的 Web 应用。以下是实现方法: 安装 Vue CLI 并创建项目 确保已安装 Vue…

用vue实现滚动

用vue实现滚动

实现滚动的基本方法 在Vue中实现滚动可以通过多种方式完成,包括使用原生JavaScript、Vue指令或第三方库。以下是几种常见的方法: 使用ref和原生JavaScript 在模板中定义一个可滚…

vue实现页面切换

vue实现页面切换

Vue 实现页面切换的方法 在 Vue 中实现页面切换通常可以通过以下几种方式完成,具体选择取决于项目需求和架构设计。 使用 Vue Router Vue Router 是 Vue.js 官方推荐的…

vue实现的页面

vue实现的页面

Vue 实现的页面示例 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是一个简单的 Vue 页面实现示例,包含基本的结构和功能。 安装 Vue 通过 CDN 引入 V…