当前位置:首页 > 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管理权限状态,保持权限数据持久化。

// 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实现aop切面

vue实现aop切面

Vue 实现 AOP 切面编程的方法 在 Vue 中实现 AOP(面向切面编程)可以通过多种方式,以下是几种常见的实现方法: 使用 Vue 混入(Mixins) Vue 的混入机制可以用于实现横切关…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template…

django vue实现

django vue实现

Django与Vue.js整合实现方案 Django作为后端框架与Vue.js作为前端框架的整合,可以通过以下方式实现: 分离式开发 前后端完全分离,Django仅提供API接口,Vue.js通过…

vue 实现挂载

vue 实现挂载

Vue 实现挂载的基本方法 在 Vue 中,挂载是将 Vue 实例与 DOM 元素关联的过程。通过挂载,Vue 可以管理 DOM 并实现数据绑定和响应式更新。 创建 Vue 实例并挂载 con…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{…