Angular 如何在NGRX中使用auth guard

Angular 如何在NGRX中使用auth guard,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,我在Angular应用程序中使用NGRX,并尝试使用auth guard。当应用程序启动时,我调度一个操作,从服务器(firebase)获取身份验证状态。问题是,如果我直接转到一个由auth-guard保护的链接,默认的auth状态为false,因此返回该状态并重定向到登录页面 这是我的激活方法 canActivate() { return this.store.select(fromAuth.getAuthenticatedStatus).pipe( /

我在Angular应用程序中使用NGRX,并尝试使用auth guard。当应用程序启动时,我调度一个操作,从服务器(firebase)获取身份验证状态。问题是,如果我直接转到一个由auth-guard保护的链接,默认的auth状态为false,因此返回该状态并重定向到登录页面

这是我的激活方法

canActivate() {
        return this.store.select(fromAuth.getAuthenticatedStatus).pipe(
            //filter(isAuth => isAuth == true || isAuth == false),
            take(1),
            map((isAuth: boolean) => isAuth),
            catchError(() => of(false))
        )
    }
在检查存储区的身份验证状态之前,是否有方法等待身份验证状态从服务器返回?我尝试过过滤并删除take操作符,但似乎不起作用

我不想将对服务器的调用放在auth-guard中,因为我不想让它在每次切换页面时都检查服务器。

您有:

@Injectable()
export class LoggedGuard implements CanActivate {

    constructor(private auth: AngularFireAuth, private router: Router) { }

    canActivate() {
        return this.auth.authState.pipe(
            take(1),
            map(user => !!user), // !! convert User object to boolean value
            tap(isLogged => {
                if(!isLogged) {
                    this.router.navigate(['/login'])
                    console.log("You are not logged in. You cannot access route.")
                }
            })
        )
    }
}
在这种情况下,我宁愿向firebase发出请求,以获取新的身份验证状态,而不是从存储区获取。这是更重要的,如果你做一些索赔的人警卫,因为如果你删除某个管理员,他可能仍然有旧的索赔


Firebase有自己的IndexedDB,如果您将store连接到浏览器中的某个“LocalDatabase”,并且您的应用程序会错误地从本地检索数据,并且不会检查更新,则即使您禁止该用户并删除其帐户,您也可以让该用户无休止地登录。

谢谢!这是可行的,但我只是希望检查一下当地的状态,而不是每次我改变路线时都点击服务器。这可能会像你写的一样有效。我不确定,但我认为Firebase库知道如何更好地更新他的authState。我认为它像实时数据库一样工作。所以authState有快照更改,并且有双向通信,若服务器上发生了更改,服务器会将这些更改发送给用户。如果没有任何更改,则使用用户浏览器中的值。