当前位置:首页 > VUE

vue实现页面权限

2026-01-19 11:29:18VUE

Vue 实现页面权限的方法

路由守卫控制权限

在 Vue 项目中,可以通过路由守卫(beforeEach)实现页面权限控制。在路由跳转前,检查用户是否有权限访问目标页面。

// router/index.js
router.beforeEach((to, from, next) => {
  const userRoles = store.getters.roles // 假设用户角色存储在 Vuex 中
  const requiredRoles = to.meta.roles // 路由元信息中定义需要的角色

  if (requiredRoles) {
    if (userRoles.some(role => requiredRoles.includes(role))) {
      next()
    } else {
      next('/403') // 无权限跳转到403页面
    }
  } else {
    next() // 无需权限直接放行
  }
})

动态路由生成

根据用户权限动态生成可访问的路由表,限制用户只能看到有权限的菜单。

vue实现页面权限

// 过滤异步路由表
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
}

// 检查权限
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}

指令控制按钮权限

使用 Vue 自定义指令控制页面中按钮的显示权限。

vue实现页面权限

// main.js
Vue.directive('permission', {
  inserted: function(el, binding, vnode) {
    const { value } = binding
    const roles = store.getters.roles

    if (value && value instanceof Array && value.length > 0) {
      const hasPermission = roles.some(role => value.includes(role))

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error('需要指定权限数组')
    }
  }
})

// 使用方式
<button v-permission="['admin']">管理员按钮</button>

权限数据管理

将权限数据存储在 Vuex 中,便于全局管理和使用。

// store/modules/permission.js
const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}

const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

服务端权限验证

前端权限控制只是辅助,真正的权限验证应该在服务端完成。每次请求时,服务端应验证用户是否有权限执行该操作。

// API 请求拦截器
service.interceptors.request.use(
  config => {
    const token = store.getters.token
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

通过以上方法的组合使用,可以实现完整的 Vue 页面权限控制体系,既保证了安全性,又提供了良好的用户体验。

标签: 权限页面
分享给朋友:

相关文章

vue实现页面

vue实现页面

Vue 实现页面的基本方法 创建 Vue 项目 使用 Vue CLI 快速初始化项目,运行以下命令安装并创建项目: npm install -g @vue/cli vue create my-pr…

vue实现页面定位

vue实现页面定位

Vue 实现页面定位的方法 在 Vue 中实现页面定位通常可以通过以下几种方式完成,包括使用原生 JavaScript 的 scrollIntoView 方法、Vue Router 的滚动行为配置,以…

vue 实现页面返回

vue 实现页面返回

实现页面返回的方法 在Vue中实现页面返回功能可以通过多种方式实现,以下是几种常见的方案: 使用Vue Router的go方法 通过Vue Router的go方法可以控制浏览器的历史记录导航。ro…

实现vue页面回退

实现vue页面回退

监听浏览器返回事件 在Vue组件中使用beforeRouteLeave导航守卫,可以监听路由变化。该方法在离开当前路由前触发,适用于需要确认或保存数据的场景。 beforeRouteLeave…

vue实现反馈页面

vue实现反馈页面

Vue 实现反馈页面的方法 基础表单结构 使用 Vue 的模板语法构建反馈表单,包含输入框、下拉选择、复选框等基础元素。表单需绑定 v-model 实现数据双向绑定。 <template&g…

css制作锁屏页面

css制作锁屏页面

使用CSS制作锁屏页面 锁屏页面通常包含一个背景、时间显示以及可能的解锁按钮或输入框。以下是实现锁屏页面的关键CSS代码和结构。 HTML结构 <!DOCTYPE html> <…