我正在使用Asp.NET Web API 2处理angular 4项目。我想在进入管理部分之前检查用户是否已获得授权。 我尝试在角度路由中设置解析器,如:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
return this.profile.getProfile()
.map(result => { setAuthorized(); return result;})
.catch(res => { return Observable.of(new Profile()); });
}
setAuthorized()函数将在全局变量中设置授权,因此可以使用函数isAuthorized()进行检查 和授权警卫:
if (this.route.firstChild != null) {
return this.route.firstChild.data.map( res => {
if (isAuthorized()) {
return true;
}
});
} else {
return Observable.of(false);
}
路由是:
const routes: Routes =
[
{path: ':lang', component: LanguageComponent,
children: [
{ path: 'dashboard', component: DashboardComponent, resolve: { authority: AuthorityResolverService} },
{ path: 'admin', component: AdminComponent, canActivate: [AuthorizedGuard], resolve: { authority: AuthorityResolverService}},
]}
];
一切似乎都正常。但问题是当我单击F5或复制URL并在新窗口中打开它时,我将始终重定向到错误页面。当我监控工作流程时,它显示当我尝试直接访问URL时它没有调用解析器:
本地主机/管理
我没有收到任何错误,但我总是被重定向。 任何想法?
答案 0 :(得分:3)
预期的行为。当您点击路线时,将首先运行警卫,如果canActivate
返回true,则将运行解析器。由于您的guard
将返回false,因此您的解析器不会被调用(并且不应该被调用)。
这意味着您可能需要重新设计一下您的逻辑,以便将配置文件/授权置于保护状态,因为它实际上是什么保护:它应该检查某些条件并根据它来解决。您的条件是用户已通过身份验证,因此属于后卫。
解析器的目的是在允许用户激活组件后获取组件所需的数据。