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
函数返回的可观察对象未完成。AngularFire2FirebaseObjectObservable
实例未完成;它们在基础数据更改时发出对象
警卫返回的观察结果必须完整。您可以通过使用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);
}