当前位置:首页 > VUE

vue 实现权限

2026-03-27 09:31:09VUE

Vue 权限控制实现方法

在 Vue 项目中实现权限控制通常涉及前端路由权限、按钮权限和接口权限三个方面。以下是几种常见的实现方式:

路由权限控制

通过动态路由实现权限过滤,在用户登录后根据角色或权限列表生成可访问的路由表:

// router/index.js
const routes = [
  { path: '/login', component: Login },
  { path: '/404', component: NotFound }
]

const router = new VueRouter({
  routes
})

// 动态添加路由
function addRoutes(permissions) {
  const allowedRoutes = filterAsyncRoutes(permissions)
  router.addRoutes(allowedRoutes)
}

// 示例过滤函数
function filterAsyncRoutes(permissions) {
  return permissions.map(permission => {
    return {
      path: permission.path,
      component: () => import(`@/views/${permission.component}`),
      children: permission.children ? filterAsyncRoutes(permission.children) : []
    }
  })
}

按钮权限控制

使用自定义指令或组件封装权限判断逻辑:

vue 实现权限

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

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

// 使用方式
<button v-permission="'user:add'">添加用户</button>

接口权限控制

在请求拦截器中校验权限:

// utils/request.js
axios.interceptors.request.use(config => {
  const token = store.getters.token
  const permission = config.permission

  if (permission && !hasPermission(permission)) {
    return Promise.reject(new Error('无访问权限'))
  }

  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`
  }

  return config
})

权限数据存储

使用 Vuex 管理权限状态:

vue 实现权限

// store/modules/permission.js
export default {
  state: {
    routes: [],
    addRoutes: [],
    permissions: []
  },
  mutations: {
    SET_ROUTES(state, routes) {
      state.addRoutes = routes
      state.routes = constantRoutes.concat(routes)
    },
    SET_PERMISSIONS(state, permissions) {
      state.permissions = permissions
    }
  },
  actions: {
    generateRoutes({ commit }, permissions) {
      return new Promise(resolve => {
        const accessedRoutes = filterAsyncRoutes(permissions)
        commit('SET_ROUTES', accessedRoutes)
        commit('SET_PERMISSIONS', permissions)
        resolve(accessedRoutes)
      })
    }
  }
}

权限验证流程

用户登录成功后获取权限数据并初始化路由:

// 登录成功后
store.dispatch('user/login', userInfo).then(() => {
  store.dispatch('permission/generateRoutes', roles).then(accessRoutes => {
    router.addRoutes(accessRoutes)
    next({ ...to, replace: true })
  })
})

全局权限守卫

在路由全局守卫中校验权限:

router.beforeEach((to, from, next) => {
  if (store.getters.token) {
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      if (store.getters.permissions.length === 0) {
        store.dispatch('permission/generateRoutes', roles).then(() => {
          next({ ...to, replace: true })
        })
      } else {
        next()
      }
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next(`/login?redirect=${to.path}`)
    }
  }
})

以上方法可根据实际项目需求进行组合或调整,实现完整的权限控制体系。

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

相关文章

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用于…

vue实现前端

vue实现前端

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

vue实现接口

vue实现接口

在 Vue 中实现接口请求 Vue 本身不直接提供 HTTP 请求功能,通常需要借助第三方库如 axios 或 fetch 来实现接口请求。以下是几种常见方法: 使用 axios 发送请求 安装 a…

vue实现list

vue实现list

Vue 实现列表渲染 在 Vue 中,可以使用 v-for 指令来渲染列表。v-for 指令基于一个数组或对象来渲染一个列表,可以遍历数组或对象的属性。 基本列表渲染 <template>…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue  实现关联属性

vue 实现关联属性

Vue 实现关联属性 在 Vue 中实现关联属性通常涉及计算属性(computed properties)或侦听器(watchers),用于根据其他属性的变化动态更新目标属性。 使用计算属性 计算属…