当前位置:首页 > VUE

vue 实现权限

2026-02-10 00:22:17VUE

Vue 实现权限管理的方法

路由权限控制

在Vue中可以通过路由守卫实现权限控制。在路由配置中添加meta字段标记权限,通过全局前置守卫检查用户权限。

// router.js
const router = new VueRouter({
  routes: [
    {
      path: '/admin',
      component: Admin,
      meta: { requiresAuth: true, roles: ['admin'] }
    }
  ]
})

router.beforeEach((to, from, next) => {
  const currentUser = store.getters.currentUser
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)

  if (requiresAuth && !currentUser) {
    next('/login')
  } else if (to.meta.roles && !to.meta.roles.includes(currentUser.role)) {
    next('/403')
  } else {
    next()
  }
})

组件级权限控制

使用自定义指令v-permission控制组件显示,在全局注册指令。

// main.js
Vue.directive('permission', {
  inserted: function(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('需要指定权限数组')
    }
  }
})

// 组件中使用
<template>
  <button v-permission="['admin']">管理员按钮</button>
</template>

按钮级权限控制

通过混入(mixin)或工具函数实现按钮权限判断。

// permission.js
export function checkPermission(permission) {
  const permissions = store.getters.permissions
  return permissions.includes(permission)
}

// 组件中使用
<template>
  <button v-if="hasPermission('user:delete')">删除用户</button>
</template>

<script>
import { checkPermission } from '@/utils/permission'

export default {
  methods: {
    hasPermission(permission) {
      return checkPermission(permission)
    }
  }
}
</script>

动态菜单生成

根据用户权限动态生成侧边栏菜单,过滤无权限的路由项。

// store.js
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)
    })
  }
}

function filterAsyncRoutes(routes, roles) {
  return routes.filter(route => {
    if (hasPermission(roles, route)) {
      if (route.children) {
        route.children = filterAsyncRoutes(route.children, roles)
      }
      return true
    }
    return false
  })
}

API权限拦截

在请求拦截器中添加权限验证,对无权限的请求返回错误。

// axios拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  response => {
    const res = response.data

    if (res.code === 401) {
      MessageBox.confirm('登录已过期', '重新登录', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        store.dispatch('user/resetToken').then(() => {
          location.reload()
        })
      })
    }
    return res
  },
  error => {
    return Promise.reject(error)
  }
)

权限数据存储

使用Vuex管理权限状态,保持权限数据持久化。

vue 实现权限

// 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)
    })
  }
}

权限系统设计要点

  • 采用RBAC(基于角色的访问控制)模型
  • 权限分为菜单权限、按钮权限、API权限
  • 后端应提供权限验证接口
  • 前端缓存权限数据减少请求
  • 敏感操作需二次验证
  • 定期审计权限分配情况

通过组合路由守卫、自定义指令、混入方法和状态管理,可以构建完整的Vue权限控制系统。实际项目中应根据业务复杂度选择合适的实现方案。

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

相关文章

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

vue实现颜色

vue实现颜色

Vue 实现颜色的方法 在 Vue 中实现颜色管理可以通过多种方式,以下是一些常见的方法: 使用 CSS 变量动态绑定颜色 在 Vue 组件的样式中定义 CSS 变量,并通过 Vue 的数据绑定动态…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signatu…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: npm i…

vue实现日历

vue实现日历

Vue 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成当…

vue 实现excel

vue 实现excel

Vue 实现 Excel 功能 前端导出 Excel 使用 xlsx 库可以轻松实现前端 Excel 导出功能。安装依赖: npm install xlsx 导出 Excel 示例代码: impo…