У меня есть охранники 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);
мысли?
isLoggedIn()
асинхронным? - person Phix   schedule 27.11.2018