我有一个问题,当我注销并导航到/
时,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
,它将按预期运行。
答案 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],
}