#angular #auth-guard
#angular #auth-guard
Вопрос:
В моем AuthGuardService у меня есть функция canLoad, которая принимает параметр типа Route . Затем я присваиваю свой URL-адрес перенаправления аутентификации свойству path этого параметра маршрута.
Однако происходит нечто странное — если путь содержит параметр маршрута, то в свойстве path этот параметр заменяется именем параметра. Например, /hello/world/123 становится /hello/world/:id .
Это означает, что пользователь перенаправляется на /hello/world/:id, если аутентификация возобновляется, например, при перезагрузке страницы.
Как я могу это решить?
Я использую Angular 8.
Это из app-routes.ts:
{
path: 'hello/world/:id',
loadChildren: () => import('./world/world.module').then(m => m.WorldModule),
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
canLoad: [AuthGuardService],
}
world-routing.module.ts
const routes: Routes = [
{
path: '',
component: WorldComponent
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class WorldRoutingModule {}
world.module.ts
@NgModule({
declarations: [
WorldComponent
],
imports: [
WorldRoutingModule,
CommonModule,
TranslateModule.forChild(),
FormsModule
],
exports: [
WorldComponent
],
providers: [L10nService],
entryComponents: [],
})
export class WorldModule {}
Из AuthGuardService
canLoad(route: Route) {
if (this.validateTokenAccess()) {
return true;
}
const url = `/${route.path}`;
this.authService.redirectTo = url;
this.authService.handleAuthentication();
return false;
}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.validateTokenAccess()) {
return true;
}
this.authService.redirectTo = state.url;
this.authService.handleAuthentication();
return false;
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.canActivate(route, state);
}
Комментарии:
1. Вы также получаете доступ к сегментам в canLoad (второй аргумент), так что, может быть, это нужно исследовать?
2. Спасибо @MikeOne! Я попытался использовать параметр segments, и я думаю, что он работает. Подробности кода см. В моем ответе.
3. Приятно! Рад, что это помогло.
Ответ №1:
Я попытался использовать вместо этого второй параметр canLoad типа UrlSegment[], как показано в приведенном ниже коде. Кажется, это работает. Я надеюсь, что это будет работать для всех маршрутов во всех ситуациях. Если кто-нибудь знает о какой-либо проблеме, которая может возникнуть, пожалуйста, дайте мне знать.
canLoad(route: Route, segments: UrlSegment[]) {
if (this.validateTokenAccess()) {
return true;
}
// const url = `/${route.path}`;
const url = segments.map(s => s.path).join('/');
this.authService.redirectTo = url;
this.authService.handleAuthentication();
return false;
}