我在Angular应用中使用NGRX,并且尝试使用身份验证防护。当应用启动时,我调度一个从服务器(firebase)获取身份验证状态的操作。问题是,如果我直接转到由auth防护程序保护的链接,则默认的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运算符,但似乎没有用。
我不想将对服务器的调用放在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发出请求以获取新的身份验证状态,而不是从存储中获取该身份。如果您为有某些主张的人提供保护,这一点就尤为重要,因为如果您删除某个管理员,他可能仍然有较旧的主张。
如果您将存储连接到浏览器中的某些“ LocalDatabase”,Firebase将拥有自己的IndexedDB,并且错误地您的应用将从本地检索数据,并且不会检查更新。您甚至可以禁止他登录并删除他的帐户,从而导致无数登录用户。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句