我正在尝试使用Angular2路由器防护来限制对我的应用程序中某些页面的访问。我正在使用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
不会向用户显示请求的页面。我假设这是因为我正在使用回调,但是我无法弄清楚该如何做。有什么想法吗?