1

我正在使用 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 时它没有调用解析器:

本地主机/管理员

我没有收到任何错误,但我总是被重定向。有任何想法吗?

4

1 回答 1

3

它预期的行为。当您到达路线时,将首先运行守卫,如果canActivate返回 true,则将运行解析器。由于您guard将返回 false,因此您的解析器将不会被调用(也不应该如此)。

这意味着您可能希望以某种方式重新设计您的逻辑,将获取配置文件/授权放入保护中,因为这就是保护的真正含义:它应该检查一些条件并根据它解决。您的条件是用户已通过身份验证,因此属于守卫。

解析器的目的是在允许用户激活组件后获取组件所需的数据。

于 2017-10-23T17:04:08.960 回答