У меня есть угловое приложение 4.3.6 с ленивыми модулями. Вот частичный корневой маршрутизатор:
const routes: Routes = [
{ path: '', redirectTo: 'fleet', pathMatch: 'full' },
{
path: '',
component: AppComponent,
canActivate: [AuthenticationGuard],
children: [
{
path: 'fleet',
loadChildren: "./modules/fleet.module",
canActivate: [AuthenticationGuard]
},
{
path: 'password/set',
loadChildren: "./modules/chooseNewPassword.module",
canActivate: [ChoosePasswordGuard]
}
]
}
]
// Exports RouterModule.forRoot(routes, { enableTracing: true });
Мои дочерние маршрутизаторы в этих двух примерах модулей:
Флот:
RouterModule.forChild([
{
path: '',
component: FleetComponent,
canActivate: [AuthenticationGuard]
}
]);
Выберите новый пароль:
RouterModule.forChild([
{
path: '',
component: ChooseNewPasswordComponent,
canActivate: [ChoosePasswordGuard]
}
]);
AuthenticationGuard
вызывает метод, который выглядит следующим образом:
return this.getUserSession().map((userSession: UserSession) => {
if (userSession && userSession.ok) {
return true;
}
else if (userSession && userSession.expired) {
this.router.navigate(['password/set'])
.catch((e: Error) => console.error(e));
return true;
}
else {
window.location.replace('/');
return false;
}
}
Итак, если сеанс пользователя в порядке, он активирует маршрут. Если срок действия пароля пользователя истек, он перенаправляет пользователя в модуль выбора нового пароля. Если сеанса нет, перенаправляет на вход.
ChoosePasswordGuard
делает то же самое, но защищает только компонент выбора нового пароля (для общей установки паролей используется другое средство):
return this.getUserSession().map((userSession: UserSession) => {
if (userSession) {
return userSession.expired;
}
else {
return false;
}
});
Это работало до разделения модуля.
Теперь я застрял в петле перенаправления. При включенной трассировке роутера я наблюдаю следующую последовательность. Пользователь входит в систему, AuthenticationGuard
исправляет перенаправления на модуль / password / set и передается на ChooseNewPasswordGuard
:
- NavigationStart (id: 4, url: '/ password / set')
- RoutesRecognized {id: 4, url: "/ password / set", urlAfterRedirects: "/ password / set", state: RouterStateSnapshot}
- GuardsCheckStart {id: 4, url: "/ password / set", urlAfterRedirects: UrlTree, state: RouterStateSnapshot}
- GuardsCheckEnd {id: 4, url: "/ password / set", urlAfterRedirects: UrlTree, state: RouterStateSnapshot, shouldActivate: true}
- NavigationCancel {id: 4, url: "/ password / set", причина: ""}
И этот цикл повторяется.
(Это также повторяется, если я заменю весь ChooseNewPasswordGuard на return Observable.of(true);
)
РЕДАКТИРОВАТЬ: меня перенаправляют на корневую страницу (/
), даже когда я указываю /#/password/set
в строке URL ...
Вопросы:
Что я сделал не так в моем маршрутизаторе (ах) или средствах защиты, чтобы заставить этот цикл теперь, когда модули загружаются лениво? Меня особенно смущает
shouldActivate: true
, за которым следуетNavigationCancel reason: ""
.Имеет ли это какое-то отношение к тому факту, что я перенаправляю непосредственно в AuthenticationGuard, и теперь, когда эта защита применяется к моему основному пустому корневому маршруту (
{ path: '', redirectTo: 'fleet', pathMatch: 'full' }
), он всегда вызывается и перенаправляет, даже после того, как я установил путь?Действительно ли мне нужно повторять
canActivate
охранник в моем дочернем маршруте и моем корневом маршруте?Как обычно, приветствуются любые другие комментарии.