守卫永远返回true

时间:2019-08-11 08:05:32

标签: angular firebase angularfire2 angular-routing angular-guards

我在Angle App中有两个非常相似的后卫。首先检查的是用户登录:

// 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)
      )
  }
}

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

下一个防护措施几乎相同,但是它会检查 not 中的用户是否登录:

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(['/'])auth ? this.router.navigate(['/'])

但是isUser保护工作良好,并且isGuest始终允许用户使用页面。 我做错了什么,为什么它不起作用?

1 个答案:

答案 0 :(得分:3)

两个可观察对象发出的值是相同的:!!authState,但它们不应该这样,因为一个应该仅在用户经过身份验证时才发出true,而另一个应该仅在用户经过身份验证时才发出true。未经验证。

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

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

tap()会产生副作用,并保持发出的事件不变。