0

我正在使用带有身份验证和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(..))

4

1 回答 1

0

新 canActivate() 的图像我已经设法解决了这个问题,但我仍然不确定为什么以前的实现不起作用..firebase 有时很奇怪。所以我制作了一个新的 observable,它从 firestore 获取用户,我直接在 can activate 函数中转换该输出,见图。以前我得到了用户,对其进行了转换,然后我从 canactivate 函数中调用了转换后的 observable,这似乎不起作用。所以数据流有问题。

于 2019-09-11T14:21:05.037 回答