当前位置:首页 > VUE

vue实现权限控制

2026-01-17 12:05:37VUE

路由级权限控制

使用Vue Router的beforeEach钩子实现路由拦截,结合用户角色或权限标识进行验证:

// router.js
router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)

  if (requiresAuth && !hasToken) {
    next('/login')
  } else if (to.path === '/login' && hasToken) {
    next('/dashboard')
  } else {
    next()
  }
})

组件级权限控制

通过自定义指令v-permission实现按钮/组件级别的权限控制:

// main.js
Vue.directive('permission', {
  inserted: function (el, binding, vnode) {
    const userPermissions = vnode.context.$store.state.user.permissions
    if (!userPermissions.includes(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

// 组件中使用
<button v-permission="'user:delete'">删除用户</button>

动态菜单生成

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

vue实现权限控制

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

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

API请求拦截

在axios拦截器中验证请求权限:

// http.js
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = 'Bearer ' + getToken()
    }
    return config
  },
  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)
  }
}

权限验证工具函数

创建可复用的权限校验方法:

// utils/permission.js
export function checkPermission(permissions, permission) {
  return permissions.includes(permission)
}

export function checkRole(roles, role) {
  return roles.includes(role)
}

服务端权限验证

确保后端接口进行二次权限验证:

// Node.js示例
router.delete('/users/:id', authMiddleware, (req, res) => {
  if (!req.user.permissions.includes('user:delete')) {
    return res.status(403).json({ message: '无权操作' })
  }
  // 业务逻辑
})

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

相关文章

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue实现 弹窗

vue实现 弹窗

Vue 实现弹窗的基本方法 使用 Vue 实现弹窗可以通过多种方式,包括组件化、指令、插件等。以下是几种常见的实现方法。 组件化实现弹窗 创建一个独立的弹窗组件,通过 props 控制显示与隐藏。…

vue实现投票

vue实现投票

Vue实现投票功能 数据准备 在Vue组件的data中定义投票相关数据,包括选项列表和当前选中状态: data() { return { options: [ { id: 1…

vue嵌套grafana实现

vue嵌套grafana实现

Vue 中嵌套 Grafana 的实现方法 使用 iframe 嵌入 Grafana 面板 在 Vue 项目中可以通过 iframe 直接嵌入 Grafana 的面板或仪表板。确保 Grafana 已…

vue实现吸附效果

vue实现吸附效果

Vue实现吸附效果的方法 吸附效果通常指页面滚动时,某个元素固定在特定位置(如顶部或底部)。以下是几种实现方式: 使用CSS的position: sticky 通过CSS的sticky定位实现吸附效…

vue实现前端排序

vue实现前端排序

Vue 实现前端排序的方法 使用 Array.prototype.sort() 方法 Vue 中可以利用 JavaScript 原生的 sort() 方法对数组进行排序。在计算属性或方法中处理数据后,…