当前位置:首页 > 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和基础用户信息,避免页面刷新后权限丢失。注意敏感信息需要加密处理。

// 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如何实现分离

Vue 实现组件分离的方法 Vue 可以通过多种方式实现组件分离,提升代码的可维护性和复用性。以下是几种常见的方法: 单文件组件 (SFC) Vue 的单文件组件(.vue 文件)将模板、脚本和样式…

vue如何实现曲线图

vue如何实现曲线图

使用 ECharts 实现曲线图 在 Vue 项目中安装 ECharts 依赖: npm install echarts --save 引入 ECharts 并创建基础图表组件: <temp…

h5响应式布局如何实现

h5响应式布局如何实现

使用媒体查询(Media Queries) 通过CSS媒体查询针对不同屏幕尺寸设置不同的样式规则。例如: @media screen and (max-width: 768px) { .c…

vue如何实现重新实现主题

vue如何实现重新实现主题

Vue 主题切换的实现方法 使用 CSS 变量动态切换主题 定义主题相关的 CSS 变量,通过修改这些变量实现主题切换。在根元素(如 :root)中定义默认主题的变量,在特定类名下定义其他主题的变量。…

vue如何实现增删

vue如何实现增删

使用 Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是具体实现方法: 数据定义与初始化 在 Vue 组件的 data 选项中定义数组来存储需要操作的数据…

vue如何实现原理

vue如何实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现原理基于响应式系统、虚拟 DOM 和组件化设计。以下是关键机制的详细解析: 响应式系统 Vue 通过 Object.defineProperty…