Je suis en train d'utiliser Angular2 routeur gardes de restreindre l'accès à certaines pages de mon application. Je suis à l'aide de Firebase d'Authentification. Afin de vérifier si un utilisateur est connecté avec Firebase, j'ai appeler .subscribe()
sur le FirebaseAuth
objet avec une fonction de rappel. Ceci est le code de la garde:
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;
});
}
}
Lorsqu'un accédez à une page qui a la garde sur elle, soit en authenticated
ou not authenticated
est imprimé sur la console (après un certain délai d'attente de la réponse de firebase). Toutefois, la navigation n'est jamais terminé. Aussi, si je ne suis pas connecté, je suis redirigé vers l' /login
route des. Donc, la question que je vais avoir est - return true
ne pas afficher la page demandée à l'utilisateur. Je suppose que c'est parce que je suis en utilisant une fonction de rappel, mais je suis incapable de trouver comment faire autrement. Toutes les pensées?