У меня есть 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
который отправляет их на другую страницу с ошибкой, потому что они не аутентифицированы и не являются администратором, и охранники должны были выгнать их при первом сбое.
Я могу воспроизвести проблему в 100% случаев, если я удалюjwt аутентификации, который AuthenticationService
проверяет, когда он вызывает isLoggedIn()
, обновляет маршрут /home
и может отслеживать AuthenticationGuard
, возвращая false
и все еще , вызывая 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);
мыслей?