当前位置:首页 > VUE

vue如何实现权限控制

2026-02-25 08:09:59VUE

路由权限控制

使用vue-router的全局守卫beforeEach,结合用户角色动态过滤路由表。定义静态路由(如登录页)和动态路由(需权限访问的路由),通过addRoutes方法动态添加符合条件的路由。

// router/index.js
const router = new VueRouter({...})
const whiteList = ['/login'] // 白名单

router.beforeEach((to, from, next) => {
  if (hasToken()) {
    if (to.path === '/login') next('/')
    else {
      const hasRoles = store.getters.roles.length > 0
      if (hasRoles) next()
      else {
        try {
          const roles = await store.dispatch('user/getUserInfo')
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })
        } catch (error) {
          next(`/login?redirect=${to.path}`)
        }
      }
    }
  } else {
    if (whiteList.includes(to.path)) next()
    else next(`/login?redirect=${to.path}`)
  }
})

按钮级权限控制

通过自定义指令v-permission实现。在全局注册指令,根据用户权限动态显示/隐藏按钮。

// directives/permission.js
function checkPermission(el, binding) {
  const { value } = binding
  const roles = store.getters.roles

  if (value && value instanceof Array) {
    if (value.length > 0) {
      const hasPermission = roles.some(role => value.includes(role))
      if (!hasPermission) el.parentNode && el.parentNode.removeChild(el)
    }
  } else {
    throw new Error(`需要指定权限数组,如v-permission="['admin']"`)
  }
}

export default {
  inserted(el, binding) {
    checkPermission(el, binding)
  },
  update(el, binding) {
    checkPermission(el, binding)
  }
}

菜单权限控制

根据用户角色过滤菜单数据。在Vuex中处理菜单数据,通过递归过滤生成符合当前用户权限的菜单树。

// store/modules/permission.js
function filterAsyncRoutes(routes, roles) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })
  return res
}

接口权限控制

在axios拦截器中添加请求头携带token,服务端验证token有效性。对于无权限的请求返回401状态码,前端统一跳转登录页。

// utils/request.js
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = `Bearer ${getToken()}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response.status === 401) {
      MessageBox.confirm('登录已过期', '重新登录', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        store.dispatch('user/resetToken').then(() => {
          location.reload()
        })
      })
    }
    return Promise.reject(error)
  }
)

权限数据持久化

使用localStoragesessionStorage存储token和基础用户信息,避免页面刷新后权限丢失。注意敏感信息需要加密处理。

vue如何实现权限控制

// utils/auth.js
export function getToken() {
  return localStorage.getItem('token')
}

export function setToken(token) {
  return localStorage.setItem('token', token)
}

export function removeToken() {
  return localStorage.removeItem('token')
}

分享给朋友:

相关文章

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

vue如何实现录音

vue如何实现录音

使用Web Audio API实现录音 在Vue中实现录音功能可以通过Web Audio API结合MediaRecorder API来完成。以下是一个基础实现方案: 安装必要的依赖: npm i…

vue如何实现轮播

vue如何实现轮播

使用 Vue 实现轮播 使用第三方库(推荐) Vue 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper。以下是使用 vue-awesome-swiper 的示…

vue如何实现分业

vue如何实现分业

Vue 实现分页的方法 在 Vue 中实现分页功能通常需要结合后端接口或前端数据处理。以下是几种常见的实现方式: 使用第三方分页组件 许多 UI 库提供了现成的分页组件,例如 Element UI…

vue如何实现绑定

vue如何实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现动态绑定 HTML 属性或组件 prop。基本语法为 v-bind:属性名="表达式",简写为 :属性名="表达式"。例如绑定 class 或 sty…

vue 如何实现返回

vue 如何实现返回

Vue 实现返回功能的方法 使用 router.go(-1) 在 Vue 中可以通过 Vue Router 的 go 方法实现返回上一页的功能。在需要触发返回的按钮或方法中调用 this.$route…