当前位置:首页 > 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 中实现组件循环通常使用 v-for 指令,可以循环渲染数组或对象的数据到组件上。 基本数组循环 通过 v-for 指令遍历数组,渲染多个相同结构的组件。…

vue页面分离的实现

vue页面分离的实现

Vue页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPa…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…

vue中如何实现循环

vue中如何实现循环

在 Vue 中实现循环 Vue 提供了 v-for 指令用于实现循环渲染列表数据。v-for 可以遍历数组、对象或数字范围,生成动态的 DOM 元素。 遍历数组 使用 v-for 遍历数组时,语法为…

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template>…