我的所有路线上都有CanActivate守卫,他们正在故障转移。
例如,我有两个警卫:
export class AuthenticationGuard implements CanActivate {
constructor(private as: AuthenticationService, private router: Router) { }
canActivate() {
if (this.as.isLoggedIn()) {
return true;
}
this.router.navigate(['/login']);
return false;
}
}
export class IsAdminGuard implements CanActivate {
constructor(private us: UserService, private router: Router) { }
canActivate() {
if (this.us.isAdmin()) {
return true;
}
this.router.navigate(['/home']);
return false;
}
}
还有我的路线守卫
const routes: Routes = [
{
path: 'home',
component: DashboardComponent,
canActivate: [AuthenticationGuard, IsAdminGuard]
}
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [ RouterModule ]
});
正在发生的事情是,如果AuthenticationGuard
失败,它将有时检查IsAdminGuard
,而不是在未通过身份验证时将某人路由到/login
发送到/home
,由于它们未通过身份验证且不是管理员,因此将它们发送到其他错误页面,并且警卫在第一次失败时应将其踢出。
如果我删除AuthenticationService
在调用isLoggedIn()
时检查的身份验证jwt,刷新/home
路由并可以跟踪{{1 }}返回AuthenticationGuard
,然后 still 调用false
这是IsAdminGuard
isLoggedIn()
有想法吗?
答案 0 :(得分:1)
考虑到isAdmin防护短路,该防护会重新检查身份验证状态。这样,身份验证真实性将永远不会被isAdmin真实性的结果所覆盖。它可能看起来很多余,但是可以使用。