流程图
![bd8cf8bad914a4845608e7c2b360824f.png](https://i-blog.csdnimg.cn/blog_migrate/5f762a8d544a732a4e4062950121d949.png)
这里用token进行鉴权主要是防止crsf攻击,crsf攻击简要介绍一下
![8b482862f83f5eeb242ebe498346c24b.png](https://i-blog.csdnimg.cn/blog_migrate/457c1ca192ac5857b6a069af4f652da3.png)
跨站脚本伪造,就是在登录安全网站之后诱导用户点击危险网站,那么危险网站就可以得到用户的cookie从而冒充用户身份对安全网站进行访问和一些违法操作。那么关键点就在于
- 登录受信任站点 A,并在本地生成cookie;
- 在不登出站点A(清除站点A的cookie)的情况下,访问恶意站点B。
所以防范的方法之一是用不能截取的token。
那这里用token进行验证,分为token存在和token不存在的情况
![9ab38b8b8398ae805b905efb8494ec5f.png](https://i-blog.csdnimg.cn/blog_migrate/e711ac89b0018716786fffcb81cbf84f.png)
路由守卫的三个参数如下
![a8e19e0937809386c08529d212dceb84.png](https://i-blog.csdnimg.cn/blog_migrate/ee76b904699cc24d4aaba526fe4ad5a4.png)
需要注意的是:next()含参的话会在跳转之后再次出发拦截器钩子,而无参数的时候不会再次触发,但是拦截器一定要触发next()才能resolve,所以如果无token登录的话不能直接next('/login'),这里的做法呢是创建一个白名单路由,也就是类似于访客模式,只有少数路由如登录路由是可以访问到的
![57ee75579e60a6a1c72e51158a51520c.png](https://i-blog.csdnimg.cn/blog_migrate/63dd96d0ad6b75a94cb2b005eb60bf26.png)
indexof()用法如下,区分大小写
![8501b8faaf374355c6a458a640d44b9d.png](https://i-blog.csdnimg.cn/blog_migrate/4aaf8712cb5411e7137241b5f14fa576.png)
![c354231d38f2bbce7f863f316a8d97b6.png](https://i-blog.csdnimg.cn/blog_migrate/10f9ec0168e041e7da0675a63edcd48c.png)
如果token存在并且没有异常的话,那么进入页面后会通过角色分配对应的路由,这里一般是后台返回该角色对应的路由
![f85b08a0da7bbba4befd7cc0e79cb17b.png](https://i-blog.csdnimg.cn/blog_migrate/dcd626f57cc2a42c2d24fd2c4eda87fe.jpeg)
vue-router通过meta里面自定义值来分配路由,结构如下
![f89bf61b2830e97a5af26b2df255587b.png](https://i-blog.csdnimg.cn/blog_migrate/f2254e7c1e48ef52c5431c4919d1527c.png)
如果角色是超管的话直接用所有路由就行
数组includes()的用法
![5cdd0128277d30b008c296a499e38c21.png](https://i-blog.csdnimg.cn/blog_migrate/0e485fec2ccb098cae25b5a576ce34ed.png)
![9965b10fb07daf8555b4f93faf288c16.png](https://i-blog.csdnimg.cn/blog_migrate/0b13cd3d5ef764f6f09e2063963e58a6.png)
否则就有对动态路由进行过滤,这里每一个用户都能访问默认路由,默认动态路由就是所有根据角色不同而动态分配的路由
当得到后台返回的角色数组时,对默认动态路由进行过滤,用filter函数,如果动态路由里面有后台返回的角色就留下来,如果是含有children的嵌套路由则再调用同样的方法一次就可,如果嵌套路由过多,可以用递归处理。
![26c70d849d7444d2037039fcbffb4a31.png](https://i-blog.csdnimg.cn/blog_migrate/b7b4f884d3ab4b445b7b7bac291562fc.jpeg)
![b526d383503f9c9ae8db85f6ac92bb7d.png](https://i-blog.csdnimg.cn/blog_migrate/04a174618aac456678893a397411fb2d.png)
数组的some函数只要有符合的值就返回true
![58d39cc105fcc132ca4dd7f3a60d95bd.png](https://i-blog.csdnimg.cn/blog_migrate/347902ff63b33c26c209ffa2058fb325.png)
说一下这里的token因为服务器代码的原因,所以token的值是放在cookie里传回来的,如下图,
![d6fa13073c5bb45f498c616584cfbfb6.png](https://i-blog.csdnimg.cn/blog_migrate/e9bd24a238a6b2f24be7bccb5eef2add.jpeg)
每一次请求的时在headers里面带上token的参数,这里在请求拦截器里写上
![55832643d2c1ba8eef4b9a5ce5ea7ccb.png](https://i-blog.csdnimg.cn/blog_migrate/7219154fa70c92aff361c8957350447a.png)
改好之后还要更新路由,这里更新路由要注意两个地方都要更新,否则获取不到正确的路由
比如说这里只用了addroutes添加路由但是现在打印路由的话
![9c0597c425fccdb45376b6a5413bcc84.png](https://i-blog.csdnimg.cn/blog_migrate/9268647a0c2e4809c5ef98903f020857.png)
![24c6105ae4196ccdd25ce30f1dd92b7b.png](https://i-blog.csdnimg.cn/blog_migrate/d1b5580a14712aaae80d2ef0c5aea655.png)
这里只用四个路由
![f018e7b9c3c43134625a4a0863b168a9.png](https://i-blog.csdnimg.cn/blog_migrate/7a9d5444c3489e809e379d93cbbff3a9.png)
![6c73697d1209e0a9e3f28a466855eee5.png](https://i-blog.csdnimg.cn/blog_migrate/3a32c84d672d7b7cdfcf77dabcacfca5.png)
而手动注入之后才是正确的能访问到的七个路由
然后我又发现既然这样是不是这要更新option就行了呢?于是我又删掉了addroutes,然后我就发现了
![dbc7ed2e66d45927b697681087761d36.png](https://i-blog.csdnimg.cn/blog_migrate/beaf77b86f1b7eb925a9184d892b0b54.png)
所有这两个都要写上去才是正确的,至于原理之后再补充