CanActivateChild未运行

时间:2019-04-29 15:31:49

标签: angular angular-router angular-router-guards angular-guards

我有一个问题,当我注销并导航到/时,canActivateChild防护措施未执行以重定向到登录。

我的要求是,未经登录,所有应用都无法访问。

这是我的根Route配置:

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 }
];

这是从userState调用我的AuthGuard(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,并且由于仪表板受保护并且用户为空,请转到/login?redirect=dashboard

一切正常,最后一部分除外。当我注销时,它会重定向到仪表板,但不会激活canActivateChild守护程序,从而成功完成对仪表板的重定向。如果我将canActivateChild替换为canActivate,它将按预期运行。

更多详细信息:

2 个答案:

答案 0 :(得分:0)

我认为您不需要与此同时使用canActivateChild。您只需要在顶层使用canActivate即可处理该路由的所有子级。

E.G:

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
        }
    }
];

希望这会有所帮助!

答案 1 :(得分:-1)

您两次声明''路径。也许它被困在第一个声明中。我建议您像这样将第一个声明移到第二个声明中。 { path: '', runGuardsAndResolvers: 'always', children: [ { path: '', pathMatch: 'full', redirectTo: 'dashboard' }, { path: 'dashboard', component: DashboardComponent }, ], canActivateChild: [AuthGuard], }