RBAC权限设计笔记

概述:基于角色的权限设计,给角色分配权限,之后给用户分配角色,结合动态路由,设置路由表

给角色设置权限

给用户分配角色 

设置路由 

//静态路由表
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },
  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: () => import('@/views/dashboard/index'),
        meta: { title: 'Dashboard', icon: 'dashboard' }
      }
    ]
  },
  {
    path: '/excel',
    component: Layout,
    hidden: true,
    children: [
      {
        path: '',
        component: () => import('@/views/excel')
      }
    ]
  }
  // 404 page must be placed at the end !!!
  // { path: '*', redirect: '/404', hidden: true }
]
//设置默认路由表
const createRouter = () => {
  const routes = new Router({
    // mode: 'history', // require service support
    scrollBehavior: () => ({ y: 0 }),
    // routes: [...constantRoutes, ...asyncRoutes]
    routes: [...constantRoutes]
  })
  return routes
}

const router = createRouter()
//路由重置方法
// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

设置动态路由表

// 动态路由项
import approvalsRouter from './modules/approvals'
import settingRouter from './modules/setting'
import attendancesRouter from './modules/attendances'
import departmentsRouter from './modules/departments'
import employeesRouter from './modules/employees'
import permissionRouter from './modules/permission'
import salarysRouter from './modules/salarys'
import socialRouter from './modules/social'

// 动态路由表
export const asyncRoutes = [
  departmentsRouter,
  settingRouter,
  employeesRouter,
  permissionRouter,
  approvalsRouter,
  attendancesRouter,
  salarysRouter,
  socialRouter
]

//路由项之setting--
import Layout from '@/layout'
export default {
  path: '/settings', // 角色设置
  component: Layout,
  children: [
    {
      path: '',
      name: 'Settings',
      component: () => import('@/views/setting'),
      meta: { title: '角色设置', icon: 'setting' }
    }
  ]
}

在路由守卫中进行动态路由项添加

……略
router.beforeEach(async (to, from, next) => {
  nProgress.start()
  const token = store.getters.token
  if (token) {
    // console.log(to.path)
    if (to.path === '/login') {
      next('/')
      nProgress.done()
    } else {
      if (!store.getters.name) {
        const menus = await store.dispatch('user/getUserInfoActions')    //开始
获取到用户拥有的路由信息
        // 根据用户角色设置路由表
        const filterRoutes = asyncRoutes.filter((route) => {
          const routeName = route.children[0].name.toLowerCase()
          return menus.includes(routeName)
        })
        console.log('filterRoutes', filterRoutes)
        router.addRoutes(filterRoutes)
        // 最后再添加404,否则会存在刷新页面跳转404页的问题
        filterRoutes.push({ path: '*', redirect: '/404', hidden: true })
        // router.addRoutes(asyncRoutes)
        // 将用户路由表保存在vuex中,达到响应式效果,渲染侧边栏也使用vuex中的数据
        store.commit('permission/setRoutes', filterRoutes)  //结束
        next({
          path: to.path,
          replace: true
        })
      }
      next()
……略

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值