Подтвердить что ты не робот

CanActivate против CanActivateChild с маршрутами без компонентов

Документация angular2 о Route Guard > оставила меня неясным, когда целесообразно использовать защитные устройства CanActivate против a CanActivateChild защита в сочетании с маршрутами без компонентов.

TL; DR: какая точка имеет CanActivateChild, когда я могу использовать безразмерные маршруты с CanActivate для достижения того же эффекта?

Длинная версия:

Мы можем иметь несколько охранников на каждом уровне иерархии маршрутизации. маршрутизатор сначала проверяет защиту CanDeactivate и CanActivateChild, от самого глубокого детского маршрута до вершины. Затем он проверяет CanActivate защищает от верхнего до самого глубокого детского маршрута.

Я понял, что CanActivateChild проверено снизу вверх, а CanActivate - сверху вниз. Для меня не имеет смысла следующий пример, приведенный в документах:

@NgModule({    
  imports: [
    RouterModule.forChild([
      {
        path: 'admin',
        component: AdminComponent,
        canActivate: [AuthGuard],
        children: [
          {
            path: '',
            canActivateChild: [AuthGuard],
            children: [
              { path: 'crises', component: ManageCrisesComponent },
              { path: 'heroes', component: ManageHeroesComponent },
              { path: '', component: AdminDashboardComponent }
            ]
          }
        ]
      }
    ])
  ],
  exports: [
    RouterModule
  ]
})
export class AdminRoutingModule {}

Таким образом, путь admin имеет маршрут без компонентов:

Рассматривая наш детский маршрут под AdminComponent, у нас есть маршрут с свойством path и child, но он не использует компонент. Мы не сделали ошибку в нашей конфигурации, потому что мы можем использовать без компонентов.

Почему код в этом случае вставляет AuthGuard в дочерний элемент и в корневой компонент (путь admin)? Не хватит ли охранять в корне?

Я создал plunkr на основе образца, который удаляет canActivateChild: [AuthGuard] и добавляет кнопку выхода на AdminDashboard. Разумеется, CanActivate родительского маршрута все еще охраняется, так что точка с наличием CanActivateChild, когда я могу использовать маршруты без компонентов с CanActivate?

4b9b3361

Ответ 1

Из документов:

Как мы узнали о защите маршрутов с помощью CanActivate, мы также можем защитить дочерние маршруты с помощью Guard CanActivateChild. Защитник CanActivateChild работает аналогично Guard CanActivate, но разница заключается в его прогоне до активации каждого дочернего маршрута. Мы защитили наш модуль функций администратора от несанкционированного доступа, но мы также могли защитить дочерние маршруты в нашем функциональном модуле.

Вот практический пример:

  • переход на /admin
  • canActivate отмечен
  • Вы перемещаетесь между дочерними элементами маршрута /admin, но canActivate не вызывается, поскольку он защищает /admin
  • canActivateChild вызывается всякий раз, когда происходит переход между дочерними элементами маршрута, на котором он определен.

Я надеюсь, что это поможет вам, если все еще неясно, вы можете проверить определенную функциональность, добавив защитные отладки.

Ответ 2

В реальном мире я считаю излишним использовать один и тот же охранник для родителя и всех его детей.

Для лучшего примера предположим, что у вас есть роли для пользователей-администраторов (Edit/View), вы можете добавить охрану только для вкладок "Редактировать".

    RouterModule.forChild([
      {
        path: 'admin',
        component: AdminComponent,
        canActivate: [AuthGuard],  //1 - redirect to login page if not logged in
        children: [
          //View Access
          {
            ......
          },
          //Edit Access
          {
            path: '',
            canActivateChild: [EditGuard], //2 - display "you don't have Edit permission to access this page"
            children: [
              { path: 'crises', component: ManageCrisesComponent },
              { path: 'heroes', component: ManageHeroesComponent },
              { path: '', component: AdminDashboardComponent }
            ]
          }
        ]
      }
    ])

Ответ 3

Я также путал документацию angular2 о routeGuard. какая разница между охраной CanActivate и CanActivateChild защита.

У меня есть некоторые выводы, я надеюсь, что это поможет вам.

в файле auth-guard.service.ts

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;

return this.checkLogin(url);
}

canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.canActivate(route, state);
}

потому что метод CanActivate вызывается в функции CanActivateChild. вы можете написать фрагмент кода, который не вызывает метод CanActivate в функции CanActivateChild.

Ответ 4

Одна из причин, по которой я могу думать, - это таймауты.

Я начинаю работать с Angular 2, используя поставщика проверки подлинности. Этот провайдер завершает сеанс, который простаивает более определенного времени.

В обычной ситуации, когда вы покидаете свой компьютер, и ваша сессия заканчивается, следующая навигация, которую вы пытаетесь, ДОЛЖНА проверить вашу текущую ситуацию. Если вы путешествуете между дочерними маршрутами, я думаю, что CanActivateChild - это защитник, который будет обнаруживать истекший сеанс, и инициирует перенаправление для входа в систему, а CanActivate не будет запускаться вообще.

Отказ от ответственности: Это было из головы, я еще не реализовал его.

Ответ 5

Что делать, если у вас есть 10 детей.

Тогда canActivateChild нужно идти только в одном месте, если у них всех есть общее требование, в отличие от 10 canActivate на каждого ребенка.

Ответ 6

TL; DR: CanActivate и CanActivateChild не предназначены для маршрута без компонентов.

Я полагаю, что документы просто упустили из виду ненужных обоих охранников на маршруте без компонентов, так как целью было просто продемонстрировать маршрут без компонентов в одной вехе документов и использование обоих охранников в другом.

Использование обоих средств защиты может быть очень полезным в определенных сценариях, например: панель администратора, позволяющая входу в систему видеть несколько компонентов, таких как рассылка, статистика ведения журнала, использование ресурсов и т.д. - на этом уровне доступ ограничен CanActivate - когда при попытке перейти к каждому компоненту роли каждого администратора-пользователя проверяются защитником CanActivateChild.