vue入门之路由守卫实现权限验证(5-2)

630 阅读4分钟

承接上文,展开如下工作内容

一、创建permission.js

脚本文件目录如下图所示

注:

NProggress为引用的进度条插件,安装:npm install --save nprogress

二、简述本次实例中的技术应用

(1). router.beforeEach(to, from, next):

全局前置守卫

**to:**即将访问的路由

**from:**当前离开的路由

**next:**在本次实例中用到了下方三种使用方式

next():可以理解为,对即将访问对路由是否放行

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新 的导航。

next(false): 中断当前的导航

(2).router.addRoutes(parm):

路由动态匹配。parm为参数,在实际开发中,通过后台接口获取,必须是一个符合 routes 选项要求的数组;当用户登录时,根据后台返回当路由数组,通过**router.addRoutes(parm),**给用户赋予不同当访问权限。
实际应用场景中的应用可以参考:addRoutes的使用

(3).next({ ...to ,replace: true}):

**含义:**如果参数to,不能找到对应的路由的话,就再执行一次beforeEach((to, from, next)直到其中的next({ ...to})能找到对应的路由为止。replace: true只是一个设置信息,告诉VUE本次操作后,不能通过浏览器后退按钮,返回前一个路由

作用: 防止AddRoutes执行尚未结束,就立刻访问路由,因找不到被添加的路由,导致白屏的问题

(4).async、await、promise

**作用:**在这里你可以理解为是解决异步操作所使用,其中promise是axios的核心应用,同时也是互联网公司面试的必考问题,具体详细可访问详细描述

(5).store.dispatch、store.getters

涉及vuex的应用,我会在下篇文章中单独讲解,在此处大致了解,是为了获取用户角色、权限的用途即可

三、构建全局前置守卫

路由守卫的官方名称是导航守卫,其中导航守卫中又有很多的分类,各有各的用处,详情可以点击链接查看官网介绍,下面我们用到的是其中的全局前置守卫。

1.代码逻辑解析:

//路由白名单设置

const whiteList = ['/login', '/Index']

router.beforeEach(async (to, from, next) => {

//加载进度条

NProgress.start()

//获取路由自定义的title作为网页title,方法的应用在上篇教程中有提及

document.title = getPageTitle(to.meta.title)

如下图所示

//获取token,方法的应用在上篇教程中有提及

const hasToken = getToken()

//token有值,表示用户已经登录

if (hasToken) {

//路由为登录页面继续访问

if (to.path === '/login') {

next({

path: '/'

})

NProgress.done() //终止进度条

} else {

//判断用户是否已通过getInfo获得其权限角色

const hasRoles = store.getters.roles && store.getters.roles.length > 0

if (hasRoles) {

//已获取用户角色,放行继续访问

next()

} else {

//未获取用户角色

try {

//获取用户角色

const {

roles

} = await store.dispatch('user/getInfo')

// 根据角色获取该角色所拥有的路由(也就是常见后台管理界面左侧的功能树)

// 也就是获取该用户所具有的权限

const accessRoutes = await store.dispatch('permission/generateRoutes', roles)

// 动态路由匹配,给该用户赋予通过后台接口获取的权限

router.addRoutes(accessRoutes)

next({

...to,

replace: true

})

} catch (error) {

// 删除token,提示错误信息,跳转到登陆页

await store.dispatch('user/resetToken')

Message.error(error || 'Has Error')

next(`/login?redirect=${to.path}`)

NProgress.done()

}

}

}

} else {

//用户未获取到token,也就是没有登录的时

//只能访问白名单中的页面

if (whiteList.indexOf(to.path) !== -1) {

next()

} else {

//其他没有访问权限的页面被重定向到登录页面

next(`/login?redirect=${to.path}`)

NProgress.done()

}

}

})

在逻辑上我们已经实现了:

(1).用户登录时:根据token验证访问接口,通过角色,动态获取自身可访问的路由权限

(2).未登录时:仅能访问自定义的白名单路由权限

小伙伴们是不是觉得用户登录后的权限验证已经结束,哈哈,草率了啊

最后一步,需要我们将该脚本在main.js中添加引用

如下图所示

main.js才是该项目的程序入口,忘记的朋友可以看下之前的教程(main.js介绍及配置),每个组件的访问都会加载main.js,进而被我们刚构建在permission.js中的**全局前置导航,进行守卫,实现路由权限的验证。
**

悟:

路漫漫其修远兮吾将上下而求索,

在编程中很多应用是多项知识点结合使用的,

我将尽最大的努力进行整合,将琐碎的知识分享给初学者。

注:本次实例中的vuex的应用,将在下载分享中继续为大家讲解。

**请继续阅读 vue入门之vuex五大属性及动态配置(6)
**