Ich versuche, Angular2-Router-Schutzvorrichtungen zu verwenden, um den Zugriff auf einige Seiten in meiner App einzuschränken. Ich verwende die Firebase-Authentifizierung. Um zu überprüfen, ob ein Benutzer bei Firebase angemeldet ist, muss ich .subscribe()
das FirebaseAuth
Objekt mit einem Rückruf aufrufen . Dies ist der Code für die Wache:
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;
});
}
}
Wenn Sie zu einer Seite navigieren, auf der sich der Schutz befindet authenticated
, oder not authenticated
die auf der Konsole gedruckt wird (nach einiger Verzögerung warten Sie auf die Antwort von Firebase). Die Navigation wird jedoch nie abgeschlossen. Wenn ich nicht angemeldet bin, werde ich zur /login
Route weitergeleitet. Das Problem, das ich habe, ist return true
, dass dem Benutzer die angeforderte Seite nicht angezeigt wird. Ich gehe davon aus, dass dies daran liegt, dass ich einen Rückruf verwende, aber ich kann nicht herausfinden, wie ich es anders machen soll. Irgendwelche Gedanken?