我目前在Angular应用程序中有一个身份验证防护,正在对我的API进行调用以检查用户的角色,然后将其返回以检查他们是否有权访问特定端点。
棘手的部分是,当他们注销时,JWT将从浏览器的本地存储中清除。因此,当警卫人员调用API来检查令牌是否有效时,API会返回401未经授权。
现在,我试图捕获401错误,并将用户重定向到登录屏幕,但是我无法这样做,我尝试在catchError
方法中添加以下内容:
setTimeout(() => this.router.navigate(['/login']));
this.router.navigate(['/login'])
然后返回false,以便调用方法可以处理它,但是这些都不起作用。
所以我基本上想做的就是,当用户在HTTP调用中收到401未经授权时,将用户重定向到登录页面。
export class GuardianGuard implements CanActivate {
constructor(
private router: Router,
private http: HttpClient
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
//Get the users role from the API based on the JWT they were authenticated with
return this.http.get(`${AppSettings.API_ENDPOINT}/Role`).pipe(
map(data => {
//Check if the returned server role is that of the guardian
if (data === "3") {
//Allow the action if it is
return true;
} else {
//Return to login and deny action if it is not
this.router.navigate(['/login']);
return false;
}
}), catchError(this.handleError));
}
private handleError(error: any) : Observable<boolean> {
setTimeout(() => this.router.navigate(['/login']));
return of(false);
}
}
答案 0 :(得分:0)
最好在某些Auth服务中具有服务逻辑。并可以如下检查授权:-
您还只能在AuthService中处理401重定向条件。
canActivate(): Observable<boolean> | Promise<boolean> | boolean {
if (this.auth.isAuthorized()) {
this.router.navigate([CONFIG.routes.login]);
return false;
} else {
return true;
}