当前位置:首页 > VUE

vue中实现权限控制

2026-01-21 08:23:29VUE

路由权限控制

通过路由守卫实现页面级别的权限控制,在router.beforeEach中校验用户权限。定义路由时添加meta字段标记所需权限:

const routes = [
  {
    path: '/admin',
    component: AdminPanel,
    meta: { requiresAuth: true, roles: ['admin'] }
  }
]

router.beforeEach((to, from, next) => {
  const userRoles = store.getters.roles // 从Vuex获取用户角色
  if (to.meta.requiresAuth && !userRoles) {
    next('/login')
  } else if (to.meta.roles && !to.meta.roles.some(role => userRoles.includes(role))) {
    next('/403') // 无权限页面
  } else {
    next()
  }
})

组件级权限控制

创建自定义指令v-permission实现组件粒度的权限控制:

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

    if (value && Array.isArray(value) && value.length > 0) {
      const hasPermission = roles.some(role => value.includes(role))
      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`需要指定权限数组,如 v-permission="['admin']"`)
    }
  }
})

使用方式:

<button v-permission="['admin']">删除</button>

API请求权限控制

在axios拦截器中添加权限验证:

axios.interceptors.request.use(config => {
  const token = store.getters.token
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`
  }
  return config
})

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 403) {
      router.push('/403')
    }
    return Promise.reject(error)
  }
)

动态菜单生成

根据用户权限过滤导航菜单:

computed: {
  accessibleRoutes() {
    return this.allRoutes.filter(route => {
      if (!route.meta || !route.meta.roles) return true
      return route.meta.roles.some(role => this.userRoles.includes(role))
    })
  }
}

权限数据管理

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

const store = new Vuex.Store({
  state: {
    roles: [],
    permissions: []
  },
  mutations: {
    SET_PERMISSIONS(state, payload) {
      state.roles = payload.roles
      state.permissions = payload.permissions
    }
  },
  actions: {
    async fetchPermissions({ commit }) {
      const res = await api.getUserPermissions()
      commit('SET_PERMISSIONS', res.data)
    }
  }
})

按钮级权限控制

通过方法判断是否显示操作按钮:

methods: {
  checkPermission(requiredPermission) {
    return this.$store.getters.permissions.includes(requiredPermission)
  }
}

模板中使用:

<button v-if="checkPermission('user:delete')">删除用户</button>

vue中实现权限控制

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

相关文章

vue页面分离的实现

vue页面分离的实现

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

vue实现递归

vue实现递归

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

vue实现后退

vue实现后退

Vue 实现后退功能的方法 在 Vue 中实现后退功能通常可以通过以下几种方式完成,具体取决于应用场景和需求。 使用 window.history API 通过原生 JavaScript 的 win…

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue slot实现

vue slot实现

vue slot 的实现方法 在 Vue 中,slot 是一种内容分发机制,允许父组件向子组件传递模板内容。以下是几种常见的 slot 实现方式: 默认 slot 默认 slot 是最基础的 slo…

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…