Angular5 路由守卫

今年下半年一直很忙,没有多少时间来写博客,很多笔记都记在了本地一起提交到了git上边。

夏末的时候做的两个vue项目中有接触到vue的路由守卫,今天在另外一个angular上,发现路由守卫有异常,导致可以跨权限访问页面。

路由守卫就不多介绍了,作业顾名思义,就是在路由跳转时判断权限的。

angular2以上,路由有CanActivate守卫和另一个跳转守卫canDeactivate。
两者一个是访问路由时触发,一个是离开路由页面时触发。

 1 import {CanActivate, Router} from '@angular/router';
 2 
 3 @Injectable()
 4 export class AuthGuard implements CanActivate {
 5 roleType: string;
 6 
 7 constructor(private testHeaderService: TestHeaderService, private _message: NzMessageService) {
 8 this.testHeaderService = testHeaderService
 9 this._message = _message
10 }
11 
12 canActivate(): boolean | Observable<boolean> | Promise<boolean> {
13 return new Observable((observer) => {
14 this.testHeaderService.checkRole().then((res) => {
15 this.roleType = res['roleType']
16 if (this.roleType === 'teacher') {
17 observer.next(true);
18 observer.complete();
19 return;
20 }
21 observer.next(false);
22 observer.complete();
23 })
24 });
25 
26 }
27 }
28 
29 async checkRole() {
30 let url = '/api/starmoocInfo/getUserInfo';
31 if (sessionStorage.aSessionId != null && sessionStorage.aSessionId !== '') {
32 url = '/api/starmoocInfo/getUserInfo?aSessionId=' + sessionStorage.aSessionId;
33 }
34 const res = await this.http.get(url).toPromise()
35 return res
36 }

 

使用:
path: '',
component: QuestionsComponent,
canActivate: [AuthGuard],

如果提前有保存角色信息,则可以直接取角色进行判断,就可以直接在方法中判断一下return就行了。但是要时时查询,就会有同步异步的问题。
angular的httpclient请求是异步的。想要使用类似同步的效果,但是试了很久都没有成功。最后使用回调的方式。而守卫的判断和返回在回调中,会一直报错,因为必须要在外层有一个返回才行。也就是说,在查询返回之前,已经进行了判断,查询也就无效了。也试了定时器,一样会报语法错误。
最后使用rxjs的Observable和Promise,实现类似同步的效果,在回调中完成了判断。

转载于:https://www.cnblogs.com/ljwsyt/p/10245459.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值