Angular 4 GET 请求(可观察)

Angular 4 GET Request (Observable)

我正在尝试在 Angular 4 项目中获得一个可观察对象\ 获取请求没问题,但是当我是管理员时,我被推到了 403 未经授权的页面, 我试图理解这个问题,我调试了代码,但我无法理解,代码 运行 非常好,但我还是被推送到 403...

   isAdmin(): Observable<object> {
        if (!this._isAdmin) {
            this._isAdmin = this.http.get('./api/account/admin')
            .map(
        (res: Response) => res.json())
        .publishReplay(1)
        .refCount()
        .catch((error: any) => {
            this.router.navigate(['/error/403']);
            return Observable.throw(error.json().error || 'Server error');
        })      
    }
        if (!this._isAdmin) {
            this.router.navigate(['/error/403']);
            return Observable.throw('Server error');
        }        
        return this._isAdmin;
    }



   canActivate(
     next: ActivatedRouteSnapshot,
     state: RouterStateSnapshot): boolean {             
         console.log("check");
     const allowedRoles = next.data.permittedRoles as Array<string>;

        this.authService.isAdmin().subscribe(
            (data: any) => {
            if (!data) {
                this.router.navigate(['/error/403']);
                return false;
            }
            allowedRoles.forEach((element: any) => {
                if (data.RoleType === element) {         
         if (data.IsAdmin) {
                return true;
            }         
        }
    }),
    (err: any) =>         
    {
        console.log(err);
        this.router.navigate(['/error/403']);
        return false;
}});
this.router.navigate(['/error/403']);
       return false;
}
}

你需要 return 从你的警卫那里观察到,因为你不能从 subscribe return。此外,如果您正在使用 HttpClient,我希望您这样做,您不需要解析为 JSON,因为 HttpClient 会为您完成。 如果 您正在使用 Http,我强烈建议您继续使用 HttpClient。无论如何,假设您使用的是 HttpClient,您的代码应该如下所示:

isAdmin(): Observable<object> {
  return this.http.get('./api/account/admin')
}

和守卫(我通过将 subscribe 更改为 map 对 Norbert 的回答稍作修改):

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
  this.authService.isAdmin().map((data) => {
    if (data && data.isAdmin) {
      return true;
    }
    this.router.navigate(['/error/403']);
    return false;
  }
}  

我省略了 forEach 循环,因为我没有看到它如何适合这里,因为您无论如何都在检查 data.isAdmin 是否存在。但是如果你出于某种原因需要它,我会建议一个 for 循环,forEach 不能 return 任何东西。您还需要将 truthy 或 falsy 值分配给变量,因为在 for 循环中 return 只会中断循环。

let bool = false;
for(let element of allowedRoles) {
  if (data.RoleType === element) {
    if (data.IsAdmin) {
      bool = true;
      return;
    } 
  }
}

if (bool) { return true }

好吧,几个月后我并没有意识到这一点,但我的 IIS 身份验证是匿名和 Windows 身份验证,我不得不删除匿名身份验证才能正常工作