Я пытаюсь использовать защиту маршрутизатора Angular2, чтобы ограничить доступ к некоторым страницам в моем приложении. Я использую аутентификацию Firebase. Для того , чтобы проверить , если пользователь вошел в систему с Firebase, я должен вызов .subscribe()
на FirebaseAuth
объект с обратным вызовом. Это код охранника:
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;
});
}
}
При переходе на страницу с охранником на консоль выводится либо authenticated
, либо not authenticated
(после некоторой задержки в ожидании ответа от firebase). Однако навигация никогда не завершается. Кроме того, если я не авторизован, меня перенаправляют на /login
маршрут. Итак, проблема, с которой я столкнулся, return true
не отображает запрашиваемую страницу для пользователя. Я предполагаю, что это потому, что я использую обратный вызов, но я не могу понять, как это сделать иначе. Есть предположения?