如何使用AngularFire2使路线守卫等待验证检查
我想让我的授权守卫等到我从firebase获得授权后再给我改道。目前,auth-guard检查首先初始化 我需要使它在canActivate中异步,或者只在调用后填充canActivate auth.guard.ts如何使用AngularFire2使路线守卫等待验证检查,angular,angularfire2,Angular,Angularfire2,我想让我的授权守卫等到我从firebase获得授权后再给我改道。目前,auth-guard检查首先初始化 我需要使它在canActivate中异步,或者只在调用后填充canActivate auth.guard.ts import { Injectable } from '@angular/core'; import { Router, CanActivate } from '@angular/router'; import { AuthService } from './auth.servic
import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService) {
console.log(this.authService.isAuthenticated); // returns false, doesn't async
}
canActivate() {
console.log(this.authService.isAuthenticated); // returns false
return this.authService.isAuthenticated;
}
}
auth.service.ts
...
import { AngularFire,
AuthProviders,
AuthMethods,
FirebaseListObservable,
FirebaseObjectObservable } from 'angularfire2';
...
@Injectable()
export class AuthService {
isAuthenticated: boolean = false;
// the problem is setting it to a bool, need to async it (( but this was from official documentation and Pluralsight tuts__
constructor(
public af: AngularFire,
private _router: Router,
private _route: ActivatedRoute ) {
this.af.auth.subscribe((auth)=>{
console.log('called after after auth guard');
if (auth == null) {
this._router.navigate(['/login']);
} else {
this.isAuthenticated = true;
}
}
});
}
那么,如何让AuthGuard的canActivate等待异步布尔值呢?
如何将其传递给AuthGuard的canActivate()函数?这是Github上一篇文章的答案
auth.service.ts:
@Injectable()
export class AuthService {
private _user: firebase.User;
constructor(public afAuth: AngularFireAuth, private db: AngularFireDatabase) {
afAuth.authState.subscribe(user => this.user = user);
}
get user(): firebase.User {
return this._user;
}
set user(value: firebase.User) {
this._user = value;
}
get authenticated(): boolean {
return this._user !== null;
}
}
auth.guard.ts:
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.auth.afAuth.authState
.take(1)
.map(authState => !!authState)
.do(authenticated => {
if (!authenticated) {
this.router.navigate(['login']);
}
});
}
}
@Injectable()
导出类AuthGuard实现了CanActivate{
构造函数(私有身份验证:身份验证服务,私有路由器:路由器){}
激活(
下一步:ActivatedRouteSnapshot,
状态:RouterStateSnashot):可观察的|承诺|布尔值{
返回this.auth.afAuth.authState
.采取(1)
.map(authState=>!!authState)
.do(已验证=>{
如果(!已验证){
this.router.navigate(['login']);
}
});
}
}