我的所有路线上都有 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
如果我删除了在调用时检查的身份验证 jwt isLoggedIn()
,刷新/home
路由并可以跟踪AuthenticationGuard
返回false
并仍在调用,我可以 100% 重现该问题IsAdminGuard
这是代码isLoggedIn()
isLoggedIn = () => {
const token = this.get();
const decoded = this.decode(token);
return token && this.isNotExpired(decoded);
};
decode = (token: string) => {
const validToken = () => parts.length < 3
const parts = token ? token.split('.') : '';
if (!token || validToken()) {
return '{}';
}
const payload = validToken() ? parts[1] : '{}';
return JSON.parse(atob(payload));
};
private isNotExpired = (decodedToken) => this.getExpiryFrom(decodedToken) > new Date();
private getExpiryFrom = (decodedToken) => new Date(decodedToken.exp * 1000);
想法?