Sto cercando di utilizzare le protezioni del router Angular2 per limitare l'accesso ad alcune pagine nella mia app. Sto usando l'autenticazione Firebase. Per verificare se un utente ha effettuato l'accesso con Firebase, devo chiamare .subscribe()
sull'oggetto FirebaseAuth
con un callback. Questo è il codice per la guardia:Angular2 canActivate() chiamata funzione asincrona
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;
});
}
}
Quando un passare a una pagina che ha la guardia su di esso, sia authenticated
, o not authenticated
viene stampato sulla console (con un certo ritardo in attesa della risposta da Firebase). Tuttavia, la navigazione non è mai completata. Inoltre, se non sono connesso, vengo reindirizzato alla rotta /login
. Quindi, il problema che sto avendo è return true
non mostra la pagina richiesta all'utente. Suppongo che ciò avvenga perché sto utilizzando una richiamata, ma non sono in grado di capire come farlo altrimenti. qualche idea?
import Osservabile come questo -> import {Observable} da 'rxjs/Observable'; –