代码之家  ›  专栏  ›  技术社区  ›  Vladimir Humeniuk

守卫总是返回真

  •  0
  • Vladimir Humeniuk  · 技术社区  · 5 年前

    在Angular应用程序中,我有两个非常相似的守卫。首先检查的是用户登录:

    // isUser guard
    
    export class isUser implements CanActivate {
      constructor(
        private fireAuth: AngularFireAuth,
        private router: Router
      ) {}
    
      canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
          return this.fireAuth.authState.pipe(
            take(1),
            map(authState => !!authState),
            tap(auth => !auth ? this.router.navigate(['/']) : true)
          )
      }
    }
    

    这一个工作正常:当用户没有登录时,不允许他打开受保护的页面。

    下一个保护几乎是相同的,但它检查用户是否 登录时间:

    export class isGuest implements CanActivate {
      constructor(
        private fireAuth: AngularFireAuth,
        private router: Router
      ) {}
    
      canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
          return this.fireAuth.authState.pipe(
            take(1),
            map(authState => !!authState),
            tap(auth => auth ? this.router.navigate(['/']) : true)
          )
      }
    }
    

    区别只是: !auth ? this.router.navigate(['/']) VS auth ? this.router.navigate(['/']) .

    但是 isUser 警卫工作良好,以及 isGuest 始终允许用户使用页面。 我做错了什么,为什么不行?

    1 回复  |  直到 5 年前
        1
  •  3
  •   JB Nizet    5 年前

    两个观测值的发射值相同: !!authState 但它们不应该这样做,因为一个应该只在用户经过身份验证时才发出true,而另一个应该只在用户没有经过身份验证时才发出true。

    map() tap() 做不同的事情。

    MAP() 将发出的事件转换为其他事件。

    () 产生副作用并保持发射的事件不变。