编写路由守卫以等待 AngularFire 和 Angularjs 中的身份验证 2
Writing a route guard to wait for auth in AngularFire and Angularjs 2
我正在尝试在 Angular.js 2 (2.0.0-rc.4)(由 angular cli 创建)中编写一个等待 AngularFire (2.0.0-beta.2) 的路由器守卫) 检查登录状态,如果用户在允许进入该状态之前已登录,则(匿名)登录用户。
我的守卫密码是:
canActivate() {
/* This part is to detect auth changes and log user in anonymously */
this.auth
.subscribe(auth => {
if (!auth) {
this.auth.login();
}
});
/* This part is to listen to auth changes and IF there is an auth, resolves this guard with a true to let user in */
return this.auth
.asObservable()
.filter(auth => {
return auth ? true : false;
})
.map(x => {
console.log("TEST 1000");
return true;
});
}
当我 运行 应用程序时,即使我看到 TEST 1000
控制台输出表明 canActivate()
返回 true
我的路由未激活。
不知道是不是我的逻辑思维有问题,或者有没有什么聪明的思路可以智能调试。
你能测试一下这是否解决了你的问题
canActivate() {
this.auth
.subscribe(auth => {
if (!auth) this.auth.login()
});
let authObs = this.auth
.asObservable()
.filter(auth => auth ? true : false)
.map(x => {
console.log("TEST 1000");
return true;
});
authObs.subscribe(a => return true);
我认为问题在于您只创建了可观察对象,并没有实际订阅它。 CanActivate 期望一个 promise 或 bool 而不是一个可观察的。
我目前正在使用它来检查身份验证以及用户是否是管理员:
授权服务:
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { AngularFire } from 'angularfire2';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Rx';
@Injectable()
export class AuthService {
admin$: Subject<boolean>;
private user: any = null;
constructor(private af: AngularFire, private router: Router) {
this.admin$ = <Subject<boolean>>new Subject();
this.af.auth.subscribe(
auth => {
if(auth){
this.user = af.database.object(`users_list/${auth.uid}`).subscribe(
res => {
this.user = res;
this.admin$.next(this.user.role === 10);
this.admin$.complete();
},
err => this.admin$.error(err)
);
}else{
this.router.navigate(['auth']);
this.admin$.next(false);
this.admin$.complete();
}
}
);
}
doLogin(credentials){
this.admin$ = <Subject<boolean>>new Subject();
this.af.auth.login(credentials);
}
admin() {
return this.admin$;
}
}
Auth Guard 服务:
constructor(private authService: AuthService, private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
this.authService.admin().subscribe(
res => {
// Navigate to the login page
if(!res) {
this.router.navigate(['/auth']);
}
},
err => console.log(err),
() => {
// console.log('auth guard can activate complete')
}
);
return this.authService.admin();
}
现在,这与您的问题的关系是,如果不在 admin$
上调用 complete()
,它将不起作用。控制台将记录 true
但路由器不会导航到下一个状态。
我几乎仍然掌握了可观察对象的窍门(因此实现不佳),如果你能修复你的代码,我真的很想看到最终结果,因为它看起来更清晰,而且可能是更好的方法。干杯!
我正在尝试在 Angular.js 2 (2.0.0-rc.4)(由 angular cli 创建)中编写一个等待 AngularFire (2.0.0-beta.2) 的路由器守卫) 检查登录状态,如果用户在允许进入该状态之前已登录,则(匿名)登录用户。
我的守卫密码是:
canActivate() {
/* This part is to detect auth changes and log user in anonymously */
this.auth
.subscribe(auth => {
if (!auth) {
this.auth.login();
}
});
/* This part is to listen to auth changes and IF there is an auth, resolves this guard with a true to let user in */
return this.auth
.asObservable()
.filter(auth => {
return auth ? true : false;
})
.map(x => {
console.log("TEST 1000");
return true;
});
}
当我 运行 应用程序时,即使我看到 TEST 1000
控制台输出表明 canActivate()
返回 true
我的路由未激活。
不知道是不是我的逻辑思维有问题,或者有没有什么聪明的思路可以智能调试。
你能测试一下这是否解决了你的问题
canActivate() {
this.auth
.subscribe(auth => {
if (!auth) this.auth.login()
});
let authObs = this.auth
.asObservable()
.filter(auth => auth ? true : false)
.map(x => {
console.log("TEST 1000");
return true;
});
authObs.subscribe(a => return true);
我认为问题在于您只创建了可观察对象,并没有实际订阅它。 CanActivate 期望一个 promise 或 bool 而不是一个可观察的。
我目前正在使用它来检查身份验证以及用户是否是管理员:
授权服务:
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { AngularFire } from 'angularfire2';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Rx';
@Injectable()
export class AuthService {
admin$: Subject<boolean>;
private user: any = null;
constructor(private af: AngularFire, private router: Router) {
this.admin$ = <Subject<boolean>>new Subject();
this.af.auth.subscribe(
auth => {
if(auth){
this.user = af.database.object(`users_list/${auth.uid}`).subscribe(
res => {
this.user = res;
this.admin$.next(this.user.role === 10);
this.admin$.complete();
},
err => this.admin$.error(err)
);
}else{
this.router.navigate(['auth']);
this.admin$.next(false);
this.admin$.complete();
}
}
);
}
doLogin(credentials){
this.admin$ = <Subject<boolean>>new Subject();
this.af.auth.login(credentials);
}
admin() {
return this.admin$;
}
}
Auth Guard 服务:
constructor(private authService: AuthService, private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
this.authService.admin().subscribe(
res => {
// Navigate to the login page
if(!res) {
this.router.navigate(['/auth']);
}
},
err => console.log(err),
() => {
// console.log('auth guard can activate complete')
}
);
return this.authService.admin();
}
现在,这与您的问题的关系是,如果不在 admin$
上调用 complete()
,它将不起作用。控制台将记录 true
但路由器不会导航到下一个状态。
我几乎仍然掌握了可观察对象的窍门(因此实现不佳),如果你能修复你的代码,我真的很想看到最终结果,因为它看起来更清晰,而且可能是更好的方法。干杯!