Próbuję użyć zabezpieczeń routera Angular2, aby ograniczyć dostęp do niektórych stron w mojej aplikacji. Używam uwierzytelniania Firebase. W celu sprawdzenia, czy użytkownik jest zalogowany z Firebase, mam do rozmowy .subscribe()
na FirebaseAuth
obiekcie z zwrotnego. Oto kod dla strażnika:
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AngularFireAuth } from "angularfire2/angularfire2";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Rx";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AngularFireAuth, private router: Router) {}
canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<boolean>|boolean {
this.auth.subscribe((auth) => {
if (auth) {
console.log('authenticated');
return true;
}
console.log('not authenticated');
this.router.navigateByUrl('/login');
return false;
});
}
}
Kiedy przejść do strony, która ma osłonę na nim, albo authenticated
czy not authenticated
jest drukowany w konsoli (po pewnym opóźnieniem czeka na odpowiedź od Firebase). Jednak nawigacja nigdy nie jest zakończona. Jeśli nie jestem zalogowany, następuje przekierowanie na /login
trasę. Tak więc problem, który mam, return true
nie wyświetla żądanej strony użytkownikowi. Zakładam, że dzieje się tak, ponieważ używam wywołania zwrotnego, ale nie jestem w stanie dowiedzieć się, jak to zrobić inaczej. jakieś pomysły?