当前位置:首页 > 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>

动态菜单生成

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

// 过滤异步路由
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管理权限状态:

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

服务端权限验证

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

vue实现权限控制

// 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 实现豆瓣电影类功能的实现方案,涵盖核心模块和技术要点: 数据获取与 API 调用 使用豆瓣开放 API(需注意调用频率限制)或第三方代理接口 推荐 axios 进行异步请求,配合…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装 scre…

vue实现selectable

vue实现selectable

Vue 实现可选择的 Select 组件 在 Vue 中实现一个可选择的 Select 组件,可以通过以下几种方式: 使用原生 HTML select 元素 <template> &…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue实现hovuer

vue实现hovuer

Vue 实现 Hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 直接控制 通过 :hover 伪类实现,无需额外的 JavaScrip…

vue实现分步

vue实现分步

Vue 实现分步功能 在 Vue 中实现分步功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 通过动态组件切换不同的步骤内容,结合 v-if 或 component 标签实现分步逻辑。…