【发布时间】:2019-09-10 18:44:13
【问题描述】:
我的任务很简单,就是可以,但我不明白为什么它不能很好地工作。 我尝试制作一个保护路线,以保护除具有“管理员”角色的用户之外的所有用户。
如何检查?我使用用户 api_token 向我的 api 服务器发送请求,服务器检查令牌,并向我发送带有“true”(具有角色)或 false 的响应。 在这部分中,一切都完美无缺。 当我尝试完全在警卫中使用此响应时出现问题
这里有我的服务代码和我的警卫。 第一个:
isAdmin(apiToken: string): Observable<string> {
const params = new FormData();
params.append('api_token', apiToken);
return this.http.post(this.urlConfig.IS_ADMIN, params)
.pipe(map(resp => ResultResponse.fromJson(resp)))
.pipe(map(ResResp => ResResp.response));
}
后卫:
admin = false;
token;
constructor(private httpAuthService: HttpAuthService,
@Inject(MessagesService) private msgService: MessagesService, private pRouter: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | boolean | UrlTree {
if (localStorage.length > 0) {
const data = JSON.parse(localStorage.getItem('tokenData'));
this.token = data.api_token;
}
if (this.token) {
this.isAdmin();
if (this.admin) {
return true;
}
this.redirectAndLogin();
}
this.redirectAndLogin();
}
private redirectAndLogin() {
this.msgService.loginWindowShow();
this.Router.navigate(['/main']);
return false;
}
private isAdmin() {
this.httpAuthService.isAdmin(this.token).subscribe(r => {
this.admin = r === 'true';
});
}
在服务的情况下,它发送到守卫“真”或“假”,是字符串类型,但它工作得很好。 但管理属性仍然为假,isAdmin 方法不会将此属性更改为“真”。并且一直守卫将我重定向到登录表单。 为什么会这样?
【问题讨论】:
-
在浏览器中应用检查并调试一次。
-
问题是您使用异步代码同时尝试使用不起作用的回调同步进行检查。您可以返回
Observable或Promise以保护您的异步检查,并且只有在此之后您才能处理您的流程。