栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > Vue.js

使用动态路由实现权限管理

Vue.js 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用动态路由实现权限管理

我们在做项目经常遇到用户的权限问题,首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细:1、接口访问的权限控制;2、页面的权限控制:①菜单中的页面是否能被访问;②页面中的按钮(增、删、改)的权限控制是否显示,正常来说用户登录后都会返回一个Token,我们把它储蓄到cookie中,然后我们可以通过axios拦截器将cookie中的用户信息存到header里面

ervice.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

getToken就是获取cookie中的Token,service是我们创建的axios实例,这样就是实现了接口端的权限管理
页面的权限控制
具体实现思路
1 创建vue实例的时候将vue-router挂载,但这个时候vue-router挂载一些登录或者不用权限的公用的页面。
2 当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表。
3 调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由。
4 使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件。
在路由router.js里面声明权限为admin的路由(异步挂载的路由asyncRouterMap)

// router.js
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export const constantRouterMap = [
  {
    path: '/',
    redirect: '/login',
    hidden: true
  },
  {
    path: '/login',
    name: '登录页面',
    hidden: true,
    component: resolve => require(['../views/login/Login.vue'], resolve)
  },
  {
    path: '/Readme',
    // name: 'Readmehome',
    index: 'Readme',
    meta: {
      title: 'Readme',
      icon: 'el-icon-menu'
    },
    component: resolve => require(['../components/common/Home.vue'], resolve),
    children: [
      {
 name: 'Readme',
 path: '/',
 meta: { title: 'Readme', icon: 'el-icon-menu' },
 component: resolve => require(['../components/page/Readme.vue'], resolve)
      }
    ]
  }
]

export default new Router({
  routes: constantRouterMap
})
// 异步挂载的路由
// 动态需要根据权限加载的路由表
export const asyncRouterMap = [
  {
    path: '/permission',
    // name: 'permissionhome',
    meta: {
      title: 'permission',
      icon: 'el-icon-setting',
      roles: ['admin']
    },
    component: resolve => require(['../components/common/Home.vue'], resolve),
    children: [
      {
 name: 'permission',
 path: '/permission',
 meta: {
   title: 'permission', icon: 'el-icon-menu', roles: ['admin']
 },
 component: resolve => require(['../components/page/permission.vue'], resolve)
      }
    ]
  },
  { path: '*', redirect: '/404', hidden: true }
]

这里我们根据 vue-router官方推荐 324 的方法通过meta标签来标示改页面能访问的权限有哪些。如meta: { role: [‘admin’,‘super_editor’] }表示该页面只有admin和超级编辑才能有资格进入。

注意事项:这里有一个需要非常注意的地方就是 404 页面一定要最后加载,如果放在constantRouterMap一同声明了404,后面的所以页面都会被拦截到404,原因就是路由匹配时是从上到下匹配的
当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由,生成最终用户可访问的路由表。路由表存在vuex里面
permission.js

router.beforeEach((to, from, next) => {
  if (getToken()) { // 判断是否有token
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      if (store.getters.roles.length === 0) {
 console.log('roles====0')
 store.dispatch('GetInfo').then(res => { // 拉取用户信息
   const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop']
   console.log('roles?', roles)
   store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
     console.log('addrouters', store.getters.addRouters)
     router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
     next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
   })
 }).catch(() => {
   store.dispatch('FedLogOut').then(() => {
     Message.error('验证失败,请重新登录')
     next({ path: '/login' })
   })
 })
      } else {
 console.log('====1')
 next() // 当有用户权限的时候,说明所有可访问路由已生成 如访问没权限的全面会自动进入404页面
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})


使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件(菜单)。

permission_routers就是该用户的权限路由数组
参考文档
项目预览链接
代码链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/240328.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号