我在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
始终允许用户使用页面。
我做错了什么,为什么它不起作用?
答案 0 :(得分:3)
两个可观察对象发出的值是相同的:!!authState
,但它们不应该这样,因为一个应该仅在用户经过身份验证时才发出true,而另一个应该仅在用户经过身份验证时才发出true。未经验证。
map()
和tap()
做不同的事情。
map()
将发出的事件转换为其他事件。
tap()
会产生副作用,并保持发出的事件不变。