当前位置:首页 > VUE

vue实现权限控制

2026-03-09 17:31:29VUE

Vue 权限控制实现方案

权限控制在 Vue 项目中通常涉及路由权限和 UI 元素权限两个方面。以下是常见的实现方法:

基于路由的权限控制

通过路由守卫拦截未授权访问,动态生成可访问路由:

// router/index.js
router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  const userRoles = getUserRoles() // 获取用户角色

  if (to.meta.requiresAuth && !hasToken) {
    next('/login')
  } else if (to.meta.roles && !to.meta.roles.includes(userRoles)) {
    next('/403') // 无权限页面
  } else {
    next()
  }
})

动态路由添加

根据用户权限动态生成可访问路由表:

// 过滤异步路由表
function filterAsyncRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role))
    } else {
      return true
    }
  })
}

// 动态添加路由
store.dispatch('GenerateRoutes', roles).then(accessRoutes => {
  router.addRoutes(accessRoutes)
})

组件级权限控制

通过自定义指令实现按钮级权限控制:

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

    if (value && value instanceof Array && value.length > 0) {
      const hasPermission = roles.some(role => value.includes(role))

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error('需要指定权限数组')
    }
  }
})

使用方式:

<button v-permission="['admin']">管理员按钮</button>

状态管理集成

在 Vuex 中管理权限状态:

// store/modules/permission.js
const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}

const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

API 请求拦截

在 axios 拦截器中处理权限相关错误:

service.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      // 处理未授权
      router.push('/login')
    } else if (error.response.status === 403) {
      // 处理无权限
      Message.error('无权限访问该资源')
    }
    return Promise.reject(error)
  }
)

权限数据格式示例

典型的后端返回权限数据结构:

{
  "roles": ["editor"],
  "permissions": [
    "article:edit",
    "article:view"
  ],
  "routes": [
    "/article/list",
    "/article/edit"
  ]
}

混合权限控制策略

结合前端控制与后端验证:

vue实现权限控制

  • 前端控制界面元素显示和路由导航
  • 后端验证每个 API 请求的权限
  • 敏感操作需要双重验证

以上方案可根据项目需求组合使用,建议中小型项目采用前端路由控制为主,大型复杂系统应加强后端权限验证。

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

相关文章

vue实现条件判断

vue实现条件判断

Vue 条件判断实现方法 Vue 提供了多种方式实现条件判断,可以根据不同场景选择合适的方式。 v-if / v-else-if / v-else 这是 Vue 中最常用的条件渲染指令,根据表达式的…

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mind-e…

vue实现用户信息删除

vue实现用户信息删除

Vue 实现用户信息删除功能 在 Vue 中实现用户信息删除功能通常涉及前端界面交互和后端 API 调用。以下是实现步骤: 前端界面设计 创建删除按钮或操作项,通常使用 @click 事件触发删除操…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…