【问题标题】:Problem with CanActivate guards when initialNavigation: 'enabled'初始导航时 CanActivate 守卫出现问题:“启用”
【发布时间】:2020-02-14 02:00:27
【问题描述】:

我有角度通用应用程序,其中部分路由受 CanActivate 保护,其中 canActivate 方法使用服务来保护路由。但是使用 initialNavigation: "enabled" 配置我的警卫不起作用。 我想,这个问题是因为:

初始导航在创建根组件之前开始。 引导程序被阻止,直到初始导航完成。 (来自角度文档)

问题是:如何在 canActivate 守卫中使用启用了 initialNavigation 的服务?

【问题讨论】:

  • 你说的“守卫不起作用”是什么意思?我确实在我的一个项目中使用了将initialNavigation 设置为enabled 的警卫呼叫服务,它确实有效
  • CanActivate Method in my guard 看起来像:canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { return this._statusService .userStatusObservable .pipe( map(status => { if(status.is_authenticated && status.is_customer) { return true; } else if(!status.is_authenticated) { setTimeout(() => this._router.navigate([])); return false; } } }) ); } 并且可能因为 引导程序被阻止,直到初始导航完成。
  • 我的错误,我使用 if( isPlatformBrowser(this._platformId) ) return null 之类的东西阻止了此服务的请求,谢谢大家的回答

标签: angular angular-router angular-universal


【解决方案1】:

从你提供的数据来看,我只能得到一点点数据。

我认为你需要的是设置一些路由,被保护的可以激活,还有一些没有路由保护。

你可以这样做。

{path: 'secure-path', component: 'SomeSecureComponent', canActivate: [AuthGuard]},
{path: 'not-a-secure-path', component: 'SomeNonSecureComponent'},

你可以做这样的事情来摆脱不安全页面中的路由保护,只是不要提供它们。

如果您认为我的问题有误,请告诉我,因为这是我从您提供的少量信息中了解到的。

【讨论】:

  • 谢谢,但我已经这样做了,这也可以,没有用于路由配置的 initialNavigation 选项。但是当我将 initialNavigation 设置为“启用”时 - 我的受保护路线不会加载。
  • 你能告诉我你的路由数组是什么样子的吗?如果是这样,我可能会回答得更好。
  • 我有 app.routing.module 和下一个配置:@NgModule({ imports: [RouterModule.forRoot(routing, {initialNavigation: 'enabled'})], exports: [RouterModule], providers: [CanActivateViaAuthGuard] }) export class AppRoutingModule { }routing 数组看起来像:const routing: Routes = [ { path: '', loadChildren: './home/home.module#HomeModule' }, { path: 'orders', loadChildren: './orders/orders.module#OrdersModule', canActivate: [CanActivateViaAuthGuard] } ];
  • 和 /orders 路由没有加载当前的 RouterModule 配置抱歉格式错误
  • 据我所知,您正在使用 Angular 应用程序进行 SSR 服务器端渲染。所以问题是当应用程序向 URL 发出请求时,该 URL 对应的页面尚未呈现。据我所知,您可以处理此问题的唯一方法是通过处理所有失败的 url 请求的 errorHandler。您可以在 forRoot 本身中设置您的默认错误处理程序。有关错误处理程序的详细信息,请参阅此链接angular.io/api/router/ExtraOptions#errorHandler
猜你喜欢
  • 2020-03-24
  • 2021-09-13
  • 2017-07-26
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多