当前位置:首页 > VUE

vue实现权限分离

2026-03-28 22:06:11VUE

Vue 权限分离实现方案

权限分离通常涉及前端路由控制、按钮级权限和接口权限。以下是几种常见的实现方法:

基于路由的动态权限控制

通过用户角色动态生成可访问的路由表,使用 vue-routeraddRoutes 方法动态挂载路由。

// 在路由守卫中检查权限
router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  if (hasToken) {
    if (to.path === '/login') {
      next('/')
    } else {
      const roles = store.getters.roles
      // 根据roles生成可访问的路由表
      const accessRoutes = asyncRoutes.filter(route => {
        return roles.some(role => route.meta.roles.includes(role))
      })
      router.addRoutes(accessRoutes)
      next({ ...to, replace: true })
    }
  } else {
    next('/login')
  }
})

按钮级权限控制

创建自定义指令 v-permission,用于控制按钮的显示与隐藏。

vue实现权限分离

// 全局注册指令
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 => {
        return value.includes(role)
      })
      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
})

// 使用方式
<button v-permission="['admin']">删除</button>

接口权限控制

在请求拦截器中添加权限验证逻辑,确保用户只能访问有权限的API。

axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

axios.interceptors.response.use(response => {
  return response
}, error => {
  if (error.response.status === 403) {
    // 处理无权限情况
    Message.error('无权限访问')
    router.push('/403')
  }
  return Promise.reject(error)
})

权限数据存储

使用 Vuex 存储用户权限信息,方便全局访问。

vue实现权限分离

const store = new Vuex.Store({
  state: {
    roles: []
  },
  mutations: {
    SET_ROLES(state, roles) {
      state.roles = roles
    }
  },
  actions: {
    getInfo({ commit }) {
      return new Promise((resolve, reject) => {
        getInfo().then(response => {
          const { roles } = response.data
          commit('SET_ROLES', roles)
          resolve(roles)
        }).catch(error => {
          reject(error)
        })
      })
    }
  }
})

权限验证工具函数

创建公共方法用于权限验证,提高代码复用性。

export function checkPermission(permissionRoles) {
  const roles = store.getters.roles
  if (permissionRoles && permissionRoles instanceof Array && permissionRoles.length > 0) {
    return roles.some(role => permissionRoles.includes(role))
  } else {
    return false
  }
}

错误页面处理

为无权限访问的情况创建专门的错误页面,提升用户体验。

// 路由配置
{
  path: '/403',
  component: () => import('@/views/error-page/403'),
  hidden: true
}

通过以上方法可以实现 Vue 项目的权限分离,确保不同角色的用户只能访问其权限范围内的功能和数据。

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

相关文章

vue computed 实现

vue computed 实现

computed 的基本用法 在 Vue 中,computed 用于声明计算属性,这些属性基于响应式依赖进行缓存。只有当依赖发生变化时,计算属性才会重新计算。 new Vue({ data: {…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue轮播实现

vue轮播实现

Vue 轮播实现方法 使用第三方库(推荐) 安装 swiper 或 vue-awesome-swiper 库,快速实现功能丰富的轮播效果。 以 vue-awesome-swiper 为例: npm…

vue nexttick 实现

vue nexttick 实现

Vue nextTick 实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它主要用于确保在 DOM 更新完成后执行某些操作。 核心实现机制 ne…

vue滑块实现

vue滑块实现

Vue滑块实现方法 使用原生HTML5 range input Vue中可以绑定原生HTML5的range类型input元素实现基础滑块功能: <template> <div&…

vue实现数据

vue实现数据

Vue 实现数据绑定的方法 Vue.js 提供了多种方式实现数据绑定,包括双向绑定、单向绑定以及动态数据绑定。以下是几种常见的实现方式: 双向数据绑定(v-model) 双向数据绑定通常用于表单元素…