当前位置:首页 > 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 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rou…

vue页面实现日历

vue页面实现日历

Vue 页面实现日历的方法 使用第三方组件库 推荐使用成熟的日历组件库,如 v-calendar 或 fullcalendar-vue,快速实现功能丰富的日历。 安装 v-calendar: np…

vue实现页面切换

vue实现页面切换

Vue 实现页面切换的方法 在 Vue 中实现页面切换通常可以通过以下几种方式完成,具体选择取决于项目需求和架构设计。 使用 Vue Router Vue Router 是 Vue.js 官方推荐…

vue实现的页面

vue实现的页面

Vue 实现的页面示例 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是一个简单的 Vue 页面实现示例,包含基本的结构和功能。 安装 Vue 通过 CDN 引入…

css如何制作页面模糊

css如何制作页面模糊

使用 backdrop-filter 属性 通过 backdrop-filter 属性可以直接为元素背后的区域添加模糊效果。该属性需要浏览器支持(如 Chrome、Edge、Safari)。示例代码:…

css制作音乐盒页面

css制作音乐盒页面

音乐盒页面设计思路 音乐盒页面通常需要结合音频播放功能与视觉设计。以下是实现一个基础音乐盒页面的关键步骤。 HTML结构搭建 基础HTML需包含音频播放器控件和播放列表: <!DOCTY…