Angular 7中CanActivateChild登出后不执行的问题求助
我明白你遇到的困扰了:登出后导航到根路径/,预期会先重定向到dashboard,然后因为未登录被CanActivateChild守卫拦截跳转到登录页,但实际守卫根本没触发,直接进入了dashboard。换成canActivate就正常,这确实和Angular早期版本的一些守卫执行逻辑问题类似,咱们来一步步解决它。
问题根源分析
你的路由配置里,第一个路由规则是:
{ path: '', pathMatch: 'full', redirectTo: '/dashboard' }
当你导航到/时,这个规则会优先匹配,直接触发重定向到/dashboard。而Angular在处理这个重定向时,会直接跳转到子路由dashboard,但并没有触发父路由(那个带canActivateChild的空路径路由)的守卫检查——因为父路由本身没有被显式激活,重定向跳过了父路由的守卫校验环节。
另外,虽然你给父路由加了runGuardsAndResolvers: 'always',但这个配置只针对父路由本身的导航变化,对这种从外部直接重定向到子路由的场景,不会强制触发子路由的守卫。
解决方案:调整路由结构
把根重定向规则移到受保护的父路由内部,确保所有进入根路径的请求都先经过守卫校验。修改后的路由配置如下:
const appRoutes: Routes = [ { path: 'login', component: LoginComponent }, { path: '', runGuardsAndResolvers: 'always', canActivateChild: [AuthGuard], children: [ // 把根重定向放到受保护的子路由里 { path: '', pathMatch: 'full', redirectTo: 'dashboard' }, { path: 'dashboard', component: DashboardComponent }, ] }, // { path: '**', component: PageNotFoundComponent } ];
为什么这样能解决问题?
现在当你导航到/时,会先匹配到带canActivateChild的父路由,然后进入内部的子路由重定向规则。此时Angular需要激活子路由dashboard,就会触发父路由的canActivateChild守卫,你的AuthGuard就能正常检查用户状态,未登录时自动跳转到/login?redirect=dashboard。
额外验证点
确保你的AuthGuard的canActivateChild方法正确调用了userState逻辑,比如:
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> { return this.userState(childRoute, state); }
这样调整后,登出导航到根路径的流程就会符合预期:/ → 进入受保护父路由 → 触发守卫 → 未登录则跳转到登录页,完全满足你“未登录时无法访问应用任何内容”的需求。
内容的提问来源于stack exchange,提问作者f.khantsis

