Javascript AuthGuard可以通过http请求激活角色

Javascript AuthGuard可以通过http请求激活角色,javascript,angular,rxjs,Javascript,Angular,Rxjs,我有一个奇怪的情况。我的AuthGuard比平常更复杂。 这取决于身份验证令牌+用户角色 因此,每当启动canActivate时,我都必须检查用户是否经过身份验证,然后检查他是否有进入它想要的路由的权限 权限检查是在后端处理的,所以我只需要发出请求并得到响应,不管用户是否被允许 我不知道如何做到这一点。检查身份验证令牌很容易,但是如何将其与http请求结合起来呢?我不知道。我尝试了很多解决方案,但总有错误或无限的等待 这是我的canActivate方法代码。请注意,checkPermission

我有一个奇怪的情况。我的AuthGuard比平常更复杂。 这取决于身份验证令牌+用户角色

因此,每当启动canActivate时,我都必须检查用户是否经过身份验证,然后检查他是否有进入它想要的路由的权限

权限检查是在后端处理的,所以我只需要发出请求并得到响应,不管用户是否被允许

我不知道如何做到这一点。检查身份验证令牌很容易,但是如何将其与http请求结合起来呢?我不知道。我尝试了很多解决方案,但总有错误或无限的等待

这是我的canActivate方法代码。请注意,
checkPermission
http.get(…)

使用开关映射

canActivate(route: ActivatedRouteSnapshot, routerState: RouterStateSnapshot) {

    return this.store.select('auth').pipe(
      take(1),
      switchMap((state: State) => {
        if (state.token) {
          return this.checkPermission(state, route);
        } else {
          return of(false);
        }
      }),
      map(res => !!res)
    );
  }

我猜
this.checkPermission(state,route)
正在返回observable,在这种情况下,您应该使用switchMap而不是main中的mappipe@GogaKoreli我试过了,但是有错误,就像e.lift不是一个函数一样,抛出确切错误的源代码是什么?@GogaKoreli请看一下Narek Answer顺便说一句,请注意你做这件事的方式在意识形态上是不正确的。我的意思是,在每个canActivate上向后端发送请求对于客户端和后端来说都是非常沉重的。您应该获取权限列表,并在本地检查客户端导航权限。不要以为我是在回避你的问题,我只是在建议更好的架构。我得到main.dd7f4d98ff8e78017d91.js:formatted:15730错误:Uncaught(承诺):TypeError:e.lift不是一个函数我不知道堆栈跟踪很奇怪
canActivate(route: ActivatedRouteSnapshot, routerState: RouterStateSnapshot) {

    return this.store.select('auth').pipe(
      take(1),
      switchMap((state: State) => {
        if (state.token) {
          return this.checkPermission(state, route);
        } else {
          return of(false);
        }
      }),
      map(res => !!res)
    );
  }