0

我正在尝试在 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;
}
}
4

2 回答 2

0

几个月后我不知道这一点,但我的 IIS 身份验证是匿名和 Windows 身份验证,我必须删除匿名身份验证才能正常工作

于 2019-12-10T13:28:46.583 回答
-1

你需要从你的守卫那里返回一个 observable,因为你不能从subscribe. 此外,如果您使用HttpClient的是 ,我希望您这样做,您不需要解析为 JSON,因为HttpClient它为您做的。如果您正在使用Http,我强烈建议您继续使用HttpClient. 无论如何,假设您使用的是 HttpClient,您的代码应该如下所示:

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

subscribe和警卫(我通过更改为 对诺伯特的回答稍作修改map):

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 不能返回任何东西。您还需要将真值或假值分配给变量,因为在 for 循环中return只会中断循环。

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

if (bool) { return true }
于 2019-09-11T14:09:00.873 回答