0

app.module.ts我的 Angular 4 应用程序使用延迟加载 ( )在文件中设置了父路由loadChildren。有些路由需要身份验证(使用canActivate),有些则不需要:

// app.module.ts
const routes: Routes = [
  // Paths that require authentication
  {
    path: '',
    children: [
      { path: 'admin', loadChildren: './admin/admin.module#AdminModule' },
      { path: 'customer-locator', loadChildren: './customer-locator/customer-locator.module#CustomerLocatorModule' }
    ],
    canActivate: [AuthGuard]
  },
  // Paths that do not require authentication
  { 
    path: 'login', 
    component: LoginComponent 
  }
];

子路由设置在每个相应的模块内。例如,对于 中的子路由CustomerLocatorModule,它们已被放置在customer-locator.module.ts

// customer-locator.module.ts
const routes: Routes = [
  {  // REQUIRES AUTHENTICATION
    path: '',
    component: CustomerLocatorComponent
  },
  {  // SHOULD NOT REQUIRE AUTHENTICATION
    path: 'edit-customer/:customerId',
    component: EditCustomerComponent
  }
]

正如当前设置的那样,所有子路由path: ''都需要进行身份验证才能访问。

EditCustomerComponent鉴于其父路由 ( ) 确实需要身份验证,子路由(在这种情况下,指向 的路由)是否可能customer-locator不需要身份验证?

4

2 回答 2

2

您在这里所做的只是对路线进行分组。这意味着你也可以这样做

// app.module.ts
const routes: Routes = [
  // Paths that require authentication
  {
    path: '',
    children: [
      { path: 'customer-locator', loadChildren: './customer-locator/customer-locator.module#CustomerLocatorModule' }
    ],
  },
  {
    path: '',
    children: [
      { path: 'admin', loadChildren: './admin/admin.module#AdminModule' },
    ],
    canActivate: [AuthGuard]
  },
  // Paths that do not require authentication
  { 
    path: 'login', 
    component: LoginComponent 
  }
];

您只是将一个组分成两组。那是你要的吗 ?

于 2017-11-22T15:54:17.463 回答
0

不知道这是否是最好的方法,但是您可以使用ActivatedRouteSnapshot获取已请求的路径/url 并进行一些检查。

在你的保护下:

canActivate(route: ActivatedRouteSnapshot): Observable<any> {
  //route has a snapshof of the current route
  //check the route and with an if statement, return observable of(true) if the route is in your whitelist
}
于 2017-11-22T15:51:13.063 回答