【发布时间】:2018-03-27 00:27:45
【问题描述】:
我有一个包含 3 条路由的路由模块:
const routes: Routes = [
{
path: '',
component: SystemComponent,
canActivate: [AuthGuard],
children: [
{path: 'vds-list', component: VdsListComponent},
{path: 'phone-list', component: PhonesListComponent}
]
}
];
@NgModule({
imports: [
RouterModule.forChild(routes)
],
exports: [
RouterModule
]
})
export class SystemRoutingModule {
}
但是AuthGuard 只保护子路由vds-list 和phone-list。这是个问题,因为我也需要保护根路由/。
更新 1 AuthGuard
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthService, private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if (this.authService.isLoggedIn) {
return true;
} else {
this.router.navigate(['/login'], {
queryParams: {
accessDenied: true
}
});
return false;
}
}
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.canActivate(childRoute, state);
}
}
还有AuthService:
@Injectable()
export class AuthService {
private loggedIn = false;
get isLoggedIn() {
return this.loggedIn;
}
constructor(private router: Router) {
}
login(user: User) {
this.loggedIn = true;
window.localStorage.setItem('user', JSON.stringify(user));
this.router.navigate(['/vds-list']);
}
logout() {
this.loggedIn = false;
window.localStorage.clear();
this.router.navigate(['/login']);
}
}
【问题讨论】:
-
如果身份验证失败,您的
AuthGuard代码会路由到哪里? -
@Narm 哦!我的错。更新问题。
-
您的路线中还缺少路线
login... -
@Alex 是的,它导致所有身份验证路由都位于 auth-route.module 中。 Auth 是独立的模块。
-
@Pavel 啊,我没注意到这不是应用路由模块,所以忽略我的评论:D
标签: angular typescript angular5