51、项⽬中的权限管理怎么实现的

答:权限管理有三个很重要的模块;

(1)⽤⼾模块:可以给⽤⼾分配不同的⻆⾊

(2)⻆⾊模块:可以授于⽤⼾不同的⻆⾊,不同的⻆⾊有不同权限

(3)权限模块:⽤于管理系统中的权限接⼝,为⻆⾊提供对应的权限

具体实现步骤

根据⽤⼾管理中给⽤⼾分配⻆⾊的不同,就有对应的菜单权限。

(1)当⽤⼾登录后,后端会把⽤⼾token和相应的⽤⼾信息(⽤⼾名/菜单权限),返回给前端,前端会先把 ⽤⼾信息先进⾏保存。

(2)在routes.js路由⽂件中把路由拆分为静态路由和动态路由,在vuex的user.js模块中,通过数组的

filter⽅法和indexOf定义⼀个递归函数,在请求⽤⼾信息的时候,再进⾏commit提交mutations⼀个

计算函数同时调⽤递归函数传递参数(参数⼀是异步路由,参数⼆是⽤⼾的权限信息)进⾏递归过滤,留 下当前⽤⼾有权限访问的路由。

(3)在mutations中,通过concat⽅法合并静态路由和过滤后的动态路由,使⽤路由的addRouter⽅法 注册为新的路由,实现根据不同的⽤⼾展⽰不同的菜单侧边栏; (后端也会进⾏⼀些权限接⼝的判断和 拦截,通过⾮法途径是访l问不了的)

复制代码
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'

const target_url = 'http://27.196.3.67:22002/isc_sso/login?service=http://27.196.109.58:8000'

NProgress.configure({ showSpinner: false })

const whiteList = ['/login', '/auth-redirect', '/bind', '/register']

router.beforeEach((to, from, next) => {
  NProgress.start();
  if (getToken()) {
    to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
    /* has token*/
    if (to.path === '/login') {
      next({ path: '/' })
      // window.location.href = target_url;
      NProgress.done()
    } else {
      if (store.getters.roles.length === 0) {
        // 判断当前用户是否已拉取完user_info信息
        store.dispatch('GetInfo').then(() => {
          store.dispatch('GenerateRoutes').then(accessRoutes => {
            // 根据roles权限生成可访问的路由表
            router.addRoutes(accessRoutes) // 动态添加可访问路由表
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
          })
        }).catch(err => {
            store.dispatch('LogOut').then(() => {
              Message.error(err)
              next({ path: '/' })
              // window.location.href = target_url
            })
          })
      } else {
        next()
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单,直接进入
      next()
    } else {
      next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
      // window.location.href = target_url
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})
相关推荐
雁鸣零落5 分钟前
如何在 Chrome 中查看其他浏览器的书签?书签空间订阅与侧边栏只读切换指南
前端·chrome·edge浏览器
hpoenixf35 分钟前
一天上线 + 零返工:我如何给复杂前端需求建立“安全感”
前端
广州华水科技1 小时前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder1 小时前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
山楂树の2 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪2 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader3 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父3 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长3 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect3 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript