CanActivateChild не работает - PullRequest
       30

CanActivateChild не работает

0 голосов
/ 29 апреля 2019

У меня проблема в том, что когда я выхожу из системы и перехожу на /, защита canActivateChild не выполняется для перенаправления на вход в систему.

Мое требование состоит в том, чтобы ни одно из приложений не было доступно без входа в систему.

Вот мой корневой конфигурационный маршрут:

const appRoutes: Routes = [
  {
    path: '',
    pathMatch: 'full',
    redirectTo: '/dashboard',
  },
  {
    path: 'login',
    component: LoginComponent
  },
  {
    path: '',
    runGuardsAndResolvers: 'always',
    children: [
      { path: 'dashboard', component: DashboardComponent },

    ],
    canActivateChild: [AuthGuard],

  }
  // { path: '**', component: PageNotFoundComponent }
];

Здесь мой AuthGuard (userState) вызывается с canActivateChild

private userState(nextRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean|UrlTree> {
  return this.auth.authState.pipe(
    first(),
    map(user => {
      if (user != null) {
        return true;
      } else {
        const url = this.router.parseUrl('/login');
        console.log('redirect url', state.url);
        url.queryParams['redirect'] = state.url;
        return url;
      }
    }),
  );
}

При входе в систему я могу перейти к/ или redirect queryParam, если он существует.При выходе из системы, я перехожу к /, идея состоит в том, что он будет перенаправлен на dashboard, и, поскольку приборная панель защищена и пользователь имеет значение null, перейдите к /login?redirect=dashboard.

Все работает, кромеПоследняя часть.Когда я выхожу из системы, он перенаправляет на панель мониторинга, но НЕ активирует защиту canActivateChild, успешно завершая перенаправление на панель мониторинга.Если я заменим canActivateChild на canActivate, он будет работать как нужно.

Более подробная информация:

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Я не думаю, что вам нужно использовать canActivateChild с этим.Вам просто нужно использовать canActivate на верхнем уровне, и он позаботится о любых детях этого маршрута.

EG:

const appRoutes: Routes = [
    { path: 'login', component: LoginComponent },
    {
        path: 'dashboard',
        canActivate: [AuthGuard],
        children: [
            { path: '', redirectTo: 'overview', pathMatch: 'full' },
            { path: 'overview', component: DashboardComponent }
            // More child routes go here
        }
    }
];

Надеюсь, это поможет!

0 голосов
/ 29 апреля 2019

Вы объявляете путь '' дважды.Возможно, его поймали в первой декларации.Я бы посоветовал вам переместить первое объявление во второе, вот так. { path: '', runGuardsAndResolvers: 'always', children: [ { path: '', pathMatch: 'full', redirectTo: 'dashboard' }, { path: 'dashboard', component: DashboardComponent }, ], canActivateChild: [AuthGuard], }

...