我正在使用带有身份验证和firestore的firebase。经过身份验证的用户在注册时存储在数据库中,其中一些用户具有“管理员”角色的额外角色字段。我想保护管理员路由,我使用 canActivate 路由保护。在 canActivate 函数中,我使用了 2 个 observables。第一个 1 获取登录用户并嵌套在另一个从 firestore 获取已保存用户的 observable 中,如果登录用户是否为管理员,则使用来自那里的信息。问题是当浏览器在浏览器中的路由类型之后刷新时路由保护工作正常,但是当使用按钮上的 routerlink 调用路由时,什么也没有发生。
尝试使用 sycnronous 值,但这些值只工作一次,并且在导航后停止工作。
canActivate 函数: https ://i.imgur.com/Rf0BZ79.png
canActivate(router: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.afAuth.getStateOnly().pipe(switchMap(user => { return this.db.getRole(user.uid) }))
}
使用的观测值: https ://i.imgur.com/hRp8zyf.png https://i.imgur.com/oV56AGl.png
// 用户对象或来自 firebase 的 null
getStateOnly() {
return this.afAuth.authState
}
//检查角色并返回true或false(userArr是一个可观察的用户数组,用于存储来自firestore的用户)
getRole(uid: string): Observable<boolean> {
return this.userArr.pipe(map(users => {
return users.filter(user => {
if (user.uid === uid) {
return user
}
})[0].roles.includes('admin')
}))
因此,这仅在我在浏览器中键入路径并且在加载路由时浏览器刷新时才有效。当我单击管理按钮导航到管理页面时它不起作用(不适用于 routerLink 或 router.navigate(..))