1

我使用 Angular Guard 来保护我的路由,我在主路由中添加canActivate attr 并且它工作正常,而对于子单路由(ReportsRou​​teModule/RequestsRou​​teModule ...),如果我想启用防护,我还需要在每个路由中设置 canActivate路线,我认为这是使用角度防护的不好方法并且浪费了很多时间。那么有什么方法可以避免它并在主路由中管理它。

请看我的应用结构和一些代码如下: 1. 应用结构:

 |-- app.module.ts
 |-- app-routing.module.ts(master route)
 |-- app.component.ts
 |-- report
    |-- report-route.module.ts(sub route)
    |-- report-aa
    |-- report-bb
    |-- report-cc
 |-- request
    |-- request-route.module.ts(sub route)
    |-- request-aa
    |-- request-bb
    |-- request-cc
 |-- etc.
  1. 代码:主路由
const routes: Routes = [
  {path: '', redirectTo: 'home', pathMatch: 'full'},
  {path: 'home', component: HomeComponent, canActivate: [AuthGuard]},
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  // providers: [AuthGuard]
})
export class AppRoutingModule {

子路线:

const routes: Routes = [
  {
    path: 'reports',
    canActivateChild: [AuthGuard],
    children: [
      {path: '', redirectTo: 'reports', pathMatch: 'full'},
      {path: 'A', component: AReportsComponent},
      {path: 'B', component: BReportsComponent},
      {path: 'C', component: CReportsComponent},
    ]
  }

];
@NgModule({
  imports: [
    RouterModule.forChild(routes),
  ],
  declarations: [
    AReportsComponent,
    BReportsComponent,
    CReportsComponent,
   ]
})
export class ReportsRouteModule {

}
4

3 回答 3

3

您可以将路由放置在父路由内,并canActive仅在父路由上使用。这样,守卫也将匹配所有子路由。

示例代码

{
    path: "", 
    canActivate: [ParentAuthGaurdService], 
    children: [
        { path: "admin-dashboard", component: AdminDashboardComponent },
        { path: "admin/user", component: UserCrudComponent },
        { path: "admin/product", component: ProductCrudComponent }
    ]
}
于 2019-10-31T06:15:18.363 回答
0

有关路由器内部的一些信息,这将帮助您理解为什么添加canACtivateGuards到每个子模块的根路由不是一个坏习惯。

当您使用Router'sforRootforChild时,它将子模块合并routes到父模块routes数组。所以这些路由变成了兄弟路由。这意味着,您必须canActivate为每个子模块的顶级路由添加防护。

如果您不想这样做,则必须将所有其他子路由作为子路由提到应用程序路由中的一个父路由,如下面的答案中所述(这可能不是您想要的)。

于 2019-10-31T06:43:22.377 回答
0

按照建议,我添加canActivate了子路线,它工作正常。

于 2019-11-05T06:44:25.200 回答