2016-11-10 4 views
9

Есть ли способ установить «base» canActivate при настройке маршрутов в Angular2? Чтобы все маршруты были покрыты одной и той же базовой проверкой, а затем каждый маршрут может иметь более детальную проверку.Использование базовой защиты для всех маршрутов в приложении Angular 2

У меня есть AppModule с маршрутизацией, как это:

@NgModule({ 
    imports: [ 
     RouterModule.forRoot([ 
      { 
       path: '', 
       component: HomeComponent, 
       canActivate: [AuthenticationGuardService], 
       data: { roles: [Roles.User] } 
      } 
     ]) 
    ], 
    exports: [ 
     RouterModule 
    ] 
}) 
export class AppRoutingModule { } 

И для модуля художественного FeatureModule:

@NgModule({ 
    imports: [ 
     RouterModule.forChild([ 
      { 
       path: "feature", 
       component: FeatureComponent, 

       // I'd like to avoid having to do this: 
       canActivate: [AuthenticationGuardService], 
       data: { roles: [Roles.User] } 
      } 
     ]) 
    ], 
    exports: [ 
     RouterModule 
    ] 
}) 
export class FeatureRoutingModule { } 

Я позволил AuthenticationGuardService проверить, если пользователь имеет доступ к маршруту с помощью ролей предоставлено в data.

Могу ли я что-то сделать, чтобы избежать необходимости устанавливать canActivate и data во всех модулях маршрутизации функций? Я бы хотел настроить «base» canActivate для всех маршрутов в этом приложении.

+0

Вы можете создать объект маршрута из функции класса или хелперов. Это самое простое (и, возможно, единственное доступное) решение. – estus

+0

@estus Итак, вы имеете в виду, что я должен сделать что-то вроде: «RouterModule.forChild ([helperService.getRoute (« feature », FeatureComponent)])? И тогда эта вспомогательная служба (или класс или метод ..) всегда добавляет базовый Guard к сгенерированному объекту маршрута? – Joel

+2

Да. Я бы лично пошел с чем-то вроде «RouterModule.forChild ([new AuthenticatedRoute ({path: ..., component: ...))])' – estus

ответ

7
const routes: Routes = [ 
    { 
    path: '', 
    canActivate: [AuthGuard], 
    children: [ 
     { path: '', component: HomeComponent }, 
     { path: 'builds', component: BuildsComponent }, 
     { path: 'files', component: FilesComponent }, 
     { path: 'publications', component: PublicationsComponent } 
    ] 
    }, 
    { path: 'login', component: LoginComponent }, 
    { path: '**', redirectTo: '' } 
]; 
+3

Во время работы это в настоящее время небезопасно, потому что дочерние маршруты, добавленные через 'forChild', добавляются как братья и сестры к маршрутам' forRoot', таким образом, не в пределах иерархии и не будут запускать охрану. –

0

Я написал решение для динамического добавления Guard для всех маршрутов моего приложения (включая те, которые определены дочерними модулями).

Я выяснил это решение, читая this Router Docs.

const routes: Routes = [ 
 
    { path: '', redirectTo: 'home', pathMatch: 'full' }, 
 
    { path: 'login', component: LoginComponent, data: { skipGuard: true } }, 
 
    { path: '403', component: ForbiddenComponent, data: { skipGuard: true } }, 
 
    { path: '**', component: NotFoundComponent, data: { skipGuard: true } } 
 
]; 
 

 
@NgModule({ 
 
    imports: [RouterModule.forRoot(routes)], 
 
    exports: [RouterModule], 
 
    providers: [] 
 
}) 
 
export class AppRoutingModule { 
 
    
 
    constructor(router: Router) { 
 
    router.config 
 
     .filter(route => !route.data || !route.data.skipGuard) 
 
     .map(route => this.addGuard(route)); 
 
    } 
 
    
 
    private addGuard(route: Route): void { 
 
    route.canActivate = [AuthGuard].concat(route.canActivate); 
 
    route.canActivateChild = [AuthGuard].concat(route.canActivateChild); 
 
    } 
 
}

 Смежные вопросы

  • Нет связанных вопросов^_^