angular - 守卫总是返回真
问题描述
我在 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
总是允许用户页面。我做错了什么,为什么它不能工作?
解决方案
两个 observables 发出的值是相同的: !!authState
,但它们不应该,因为一个应该只在用户通过身份验证时发出 true,而另一个应该只在用户未通过身份验证时发出 true。
map()
并tap()
做不同的事情。
map()
将发出的事件转换为其他事件。
tap()
产生副作用并将发出的事件保持原样。
推荐阅读
- azure-sphere - azuresphere 实时应用程序 - 从兼容的预构建 ELF (.out) 文件生成 .image 文件
- sql - 按子查询的 SQL 分组过滤器
- c - C 和内联函数中的独立目标代码
- ruby-on-rails - 如何在 Windows 10 上修复 Rails 缺少的 libcurl 库?
- windows - 客户端USB设备驱动查询
- c# - 当鼠标悬停到统一 EditorGUILayout.Popup() 时,无法添加要显示的工具提示
- javascript - 无法获取 JSON 文件
- ios - Swift @functionBuilder 无法识别可变参数元素
- android - 外围设备查找服务
- c++ - 使用 CMake 而不是 g++ 链接 GDAL 库