Angular 角度2可激活防护装置不工作

Angular 角度2可激活防护装置不工作,angular,angular2-routing,angular2-security,Angular,Angular2 Routing,Angular2 Security,我正在使用Observable返回canActivate()。 以下功能已设置为测试,并且已正确解析,组件显示 canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { return Observable.from([{ admin: true }]).map(x => { if (x.admin) return true;

我正在使用
Observable
返回
canActivate()
。 以下功能已设置为测试,并且已正确解析,组件显示

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
  return Observable.from([{ admin: true }]).map(x =>
  {
    if (x.admin) return true;
    return false;
  });
}
以下是路线:

{
  path: 'admin',
  canActivate: [AdminGuard],
  children: [
    ...adminRoutes
  ]
},
以下是我的控制台输出:

isAdmin returned false
admin-guard.service.ts:27redirectToLogin
auth.service.ts:36 navigating to stored path "/admin"
auth.service.ts:21 Object {isAdmin: true, isPaid: false, $key: "xYFs8kMDpKdYKxDw4AL21FtnSWn1"}
admin-guard.service.ts:25 isAdmin returned true
admin-guard.service.ts:31 canActivate = true
下面是isAdmin()函数,以防您感兴趣:

isAdmin(): Observable<boolean> {
    if (!this.auth) return Observable.from([false]);
    const uid = this.auth.uid;
    return this.af.database.object(`user/${uid}`).do(x => console.log(x)).map(x => x.isAdmin);
}
isAdmin():可观察{
如果(!this.auth)从([false])返回可观察的;
const uid=this.auth.uid;
返回这个.af.database.object(`user/${uid}`).do(x=>console.log(x)).map(x=>x.isAdmin);
}

您的
isAdmin
函数返回的可观察对象未完成。AngularFire2
FirebaseObjectObservable
实例未完成;它们在基础数据更改时发出对象

警卫返回的观察结果必须完整。您可以通过使用
first
(或
take(1)
)在发出第一个值时完成可观察值来确保这一点:

canActivate(
路由:ActivatedRouteSnapshot,
状态:RouterStateSnapshot
):可见{
const isAdmin$=this.auth.isAdmin();
返回isAdmin$.first().map(x=>
{
log('isAdmin返回'+x');
如果(!x){
console.log('redirectToLogin');
this.auth.redirectToLogin(state.url);
返回false;
}否则{
log('canActivate=true');
返回true;
}
});  
}
在撰写本文时,必须完成返回的可观察对象。然而,Angular现在调用返回的observable,因此不再需要observable完成

isAdmin(): Observable<boolean> {
    if (!this.auth) return Observable.from([false]);
    const uid = this.auth.uid;
    return this.af.database.object(`user/${uid}`).do(x => console.log(x)).map(x => x.isAdmin);
}