Как применить защиту маршрутизации к модулям маршрутизации функциональных модулей?

Итак, я создаю приложение Angular 4, в котором я хочу, чтобы все маршруты были защищены (конечно, за исключением маршрута входа). Я пытаюсь использовать функциональные модули и маршрутизацию функциональных модулей. Итак, представьте что-то вроде этого:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuardService } from './auth/auth-guard.service';
import { LoginComponent } from './login/login.component';
import { RegisterComponent } from './register/register.component';
import { ProtectedRouteComponent } from './protected-route/protected-route.component';

const routes: Routes = [
  { path: 'login', component: LoginComponent }, // no auth guard for login
  {
    path: '',
    canActivate: [AuthGuardService],
    children: [
      {
        path: '',
        children: [
          { path: 'register', component: RegisterComponent },
          { path: 'protected', component: ProtectedRouteComponent }
        ]
      }
    ]
  }
];

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

, для корневого модуля, а затем конфигурацию маршрутизации пользовательского функционального модуля, например:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { UsersComponent } from './users.component';

const routes: Routes = [
  { path: 'users', component: UsersComponent }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class UsersRoutingModule {}

Что было бы лучшим способом:

  • Продолжайте использовать маршрутизацию функциональных модулей и
  • Применить защиту маршрута к маршрутизации функционального модуля пользователя без репликации защиты canActivate? Можно ли каким-либо образом передать его в маршрутизацию пользовательского функционального модуля из корневого модуля маршрутизации?

Спасибо,
Ираклис


person Iraklis Alexopoulos    schedule 19.08.2017    source источник
comment
если вы хотите повторно использовать свою защиту, используйте общий модуль, который будет доступен в вашем приложении.   -  person Rahul Singh    schedule 19.08.2017
comment
Спасибо, Рахул, я действительно мог это сделать. Однако мой вопрос больше касается создания конфигурации, которая позволяет наследовать мою защиту и применять ее к маршрутам, настроенным в функциональных модулях. Каков наилучший способ достижения этого?   -  person Iraklis Alexopoulos    schedule 19.08.2017
comment
Хм... вы определенно можете сделать это с лениво загруженными модулями.   -  person Lyubimov Roman    schedule 19.08.2017
comment
Я думаю, нет никакого способа сделать то, что вы хотите. Вы можете использовать службу, чтобы сделать методы одинаковыми, но это немного хакерски.   -  person Lyubimov Roman    schedule 19.08.2017
comment
Понятно, спасибо @LyubimovRoman, ценю!   -  person Iraklis Alexopoulos    schedule 20.08.2017


Ответы (1)


Искал то же самое, и решение, которое я нашел, включает следующие шаги:

  • Не импортируйте свой функциональный модуль через модули приложения.
  • Вместо этого импортируйте функциональный модуль как часть маршрутов вашего модуля приложения.
{
    path: '',
    canActivate: [AuthGuardService],
    children: [
      {
        path: '',
        children: [
          { path: 'register', component: RegisterComponent },
          { path: 'protected', component: ProtectedRouteComponent }
        ]
      },
      {
        path: '',
        children: () => UsersModule
      }
    ]
  }

Одна вещь, которую следует учитывать:

  • Другие модули НЕ будут иметь доступ к компонентам и службам вашего UserModule (пока вы не посетили один из /users маршрутов)
  • Это может не быть проблемой, так как ваши модули уже могут быть хорошо разделены.
person ntziolis    schedule 22.11.2019