最佳答案
我正在尝试使用 Angular2路由器保护,以限制访问我的应用程序中的一些网页。我正在使用 Firebase 验证。为了检查用户是否使用 Firebase 登录,我必须使用回调调用 FirebaseAuth
对象上的 .subscribe()
。这是守卫的密码:
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
不能向用户显示请求的页面。我假设这是因为我正在使用回调函数,但是我无法找到其他方法。有什么想法吗?