【问题标题】:how do I use an auth guard with NGRX如何在 NGRX 中使用身份验证保护
【发布时间】:2020-02-10 11:25:56
【问题描述】:

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

这是我的 canActivate 方法

canActivate() {
        return this.store.select(fromAuth.getAuthenticatedStatus).pipe(
            //filter(isAuth => isAuth == true || isAuth == false),
            take(1),
            map((isAuth: boolean) => isAuth),
            catchError(() => of(false))
        )
    }

有没有办法等到身份验证状态从服务器返回后再检查商店的身份验证状态?我尝试过过滤并删除 take 运算符,但似乎没有效果。

我不想在身份验证守卫中调用服务器,因为我不希望它在每次切换页面时检查服务器。

【问题讨论】:

    标签: angular rxjs ngrx


    【解决方案1】:

    你有:

    @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 发出请求以获取新的身份验证状态,而不是将其从商店中取出。如果您为拥有某些声明的人设置保护,这一点更为重要,因为如果您删除某个管理员,他可能仍有旧声明。

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

    【讨论】:

    • 谢谢!这会起作用,但我希望每次更改路由时只检查本地状态而不访问服务器
    • 我觉得这可能会像你写的那样工作。我不确定,但我认为 Firebase 库知道如何更好地更新他的 authState。
    • 我认为它像实时数据库一样工作。所以 authState 有 SnapShotChanges 并且如果服务器上发生变化,服务器会向用户发送这些变化。如果用户浏览器没有更改 firebase 使用值。
    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 2016-12-19
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多