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

分享给朋友:

相关文章

vue如何实现登录

vue如何实现登录

实现登录功能的基本步骤 使用Vue实现登录功能通常需要结合后端API、状态管理以及路由控制。以下是常见的实现方式: 创建登录表单组件 在Vue组件中构建包含用户名和密码输入框的表单: <te…

vue实现登录权限

vue实现登录权限

路由守卫实现权限控制 在Vue项目中,可以通过路由守卫(Navigation Guards)来控制页面访问权限。在router/index.js中配置全局前置守卫: router.beforeEac…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

如何实现翻页式h5

如何实现翻页式h5

翻页式H5的实现方法 翻页式H5通常指通过滑动或点击切换页面的交互形式,常用于营销活动、产品展示等场景。以下是几种常见的实现方式: 使用HTML5和CSS3实现基础翻页 通过CSS3的transfo…

vue如何实现渲染

vue如何实现渲染

Vue 渲染实现方法 Vue 的渲染主要通过模板编译、虚拟 DOM 和响应式系统实现。以下是具体实现方式: 模板编译 Vue 模板会被编译成渲染函数。模板可以写在 .vue 文件的 <temp…

vue 如何实现返回

vue 如何实现返回

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