Angular 2, как заставить auth guard работать с наблюдаемым
Я пытаюсь внедрить auth guard в один из моих маршрутов, но не могу заставить его работать, так как не знаю, как это сделать с помощью наблюдаемого.
я использую ngrx/store
чтобы сохранить мой токен, а затем в гвардии я получаю его с помощью this.store.select('auth')
, который выбирает объект, который выглядит следующим образом (если вы вошли в систему):
{
token: 'atokenstring',
isAuthenticated: true,
isPending: false
}
И охранник выглядит так:
export class AuthGuardService implements CanActivate {
constructor(private router: Router, private store: Store<IStore>) {}
canActivate(): Observable<any> {
return this.store.select('auth').let((state: Observable<IAuthStorage>) => state.filter((auth: IAuthStorage) => !auth.isPending && auth.isAuthenticated)).map(
(auth: IAuthStorage) => {
if (!auth.isAuthenticated) {
return this.router.navigateByUrl('admin/login');
}
else {
return true;
}
}
);
}
}
Теперь проблема в том, что охранник возвращает наблюдаемое, а не логическое значение. Что приводит к тому, что маршрут не отображается, даже если вы попали внутрь else
который возвращается true
,
Как я могу сделать так, чтобы охранник возвращал логическое значение, а не наблюдаемое?
1 ответ
Не уверен, что это все еще так, но некоторое время назад что-то подобное требовалось
canActivate(): Observable<any> {
return this.store.select('auth').let((state: Observable<IAuthStorage>) => state.filter((auth: IAuthStorage) => !auth.isPending && auth.isAuthenticated)).map(
(auth: IAuthStorage) => {
if (!auth.isAuthenticated) {
return this.router.navigateByUrl('admin/login');
}
else {
return true;
}
}
).first(); // <<<=== added
}
для маршрутизатора только для ожидания одного события, а не для самого наблюдаемого для завершения.
first
должен быть импортирован, чтобы быть доступным.