zoukankan      html  css  js  c++  java
  • 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,实现类似同步的效果,在回调中完成了判断。

    FIGHTING
  • 相关阅读:
    1088
    1082 read number in chinese
    1079 total sales of supply chain
    1075 pat judge
    1074 reverse list
    1071 speech pattern
    ts 之 多种泛型的处理方式
    玩一下node中的child_process
    玩转 js 位运算
    记录一下尝试的class和function分别作为构造函数方法
  • 原文地址:https://www.cnblogs.com/ljwsyt/p/10245459.html
Copyright © 2011-2022 走看看