当前位置:首页 > 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.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 存储用户权限信息,方便全局访问。

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

错误页面处理

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

vue实现权限分离

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

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

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

相关文章

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue实现签章

vue实现签章

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

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变量…

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <i…