3

我有一个带有后端的角度应用程序。在应用程序启动之前,身份验证由带有 Kerberos 的浏览器管理。响应包含一个 JWT,其中包含角色。

我的方法是在应用程序开始获取用户凭据时对服务器进行额外的 HTTP 调用。这是通过 in 实现的APP_INITIALIZERapp.module.ts因此在应用程序启动时我已经拥有凭据。

providers: [
    ...,
    {
      provide: APP_INITIALIZER,
      useFactory: Utilitys.authServiceFactory,
      deps: [AuthenticationService],
      multi: true   
    }]

这工作正常。但我的问题是:我是否必须打一个额外的电话,或者有没有办法从浏览器请求中获得响应?

如果是:怎么可能?

如果否:是否APP_INITIALIZER推荐只获取一次数据的方法?或者我应该使用 HTTP 调用来保护所有路由route guard

4

2 回答 2

3

要仅在您的应用程序启动后获取数据,您也可以使用Route Guards.

您可以定义一个受路由保护保护的无组件路由,如下所示:

// Route Guard
canActivate(): boolean | Promise<boolean> | Observable<boolean> {
    if (this.yourService.isAuthenticated()) {
      return true;
    }
    return this.loginService.login();
}

// Routes
{
    path: '',
    canActivate: [AuthGuard],
    children: [
      { path: 'comp1', component: Comp1 },
      { path: 'comp2', component: Comp2 },
      ...
    ]
}

这样,每条路线都受到您的保护,您可以检查您的用户是否已登录/经过身份验证以访问您的应用程序。

请注意,您的常规组件将是无组件受保护路由的子级。

于 2018-05-15T05:57:12.717 回答
0

经过更多研究后,我还没有找到无需额外 http 调用服务器即可获取用户信息的解决方案。

对于APP_INITIALIZR我最初的用例来说效果很好。但是后来我AuthenticationService的扩展并且APP_INITIALIZR由于循环依赖而无法处理需要注入路由器的服务。因此,我在接受的答案中推荐解决方案。

于 2018-05-04T08:19:50.060 回答