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
?
Ответы
Ответ 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
.