为长文本致歉-只是设置场景。
我在Angular应用中使用AWS Amplify(Cognito)进行身份验证。 AWS Amplify提供了一个AmplifyService,该服务具有可观察到的authStateChange $,可提供有关身份验证状态的更新。
用户登录后,将会话存储在本地/ cookie存储中,因此,当页面重新打开/刷新等时,会话将从存储中返回。例如authStateChange $返回状态为“ signedIn”。
我还有一个用户会话(AppSession),其中包括当前用户会话的其他一些域信息。
ggplot(fall2, aes(Hall, total)) +
geom_col(aes(fill = total), width = 1) +
guides(fill=FALSE) +
ggtitle("Fall Events by Hall") +
facet_wrap(~Month, nrow = 1, scales = "free_x") +
scale_x_discrete(expand = c(0,0))
由于该会话由多个组件使用,因此我将其作为我的UserStore中的BehaviorSubject公开。
//AppSession.ts
export interface Session {
package?: PurchasedPackage;
authState: string;
}
我想发生的事情是我想从authStateChange观察值在AppSession中设置authState属性。像
//UserStore.ts
@Injectable()
export class UserStore {
private _session$: BehaviorSubject<AppSession>;
get session(): Observable<Session> {
return this._session$.asObservable();
}
....
}
在我的应用中,我有一个主页,只有“ SignIn”用户可以看到。因此,我有一个“ UnauthenticatedGuard”来保护它,如下所示:
//UserStore.ts
constructor(private amplifyService: AmplifyService){
/**
* If the user logs in, then update their details.
*/
this.amplifyService.authStateChanges$.subscribe(
(event) => {
this._session = new BehaviorSubject({
authState: event.state
})
}
)
}
}
现在的麻烦是,当我启动我的应用程序时,UnauthenticatedGuard在this.amplifyService.authStateChanges $ observable发出signedIn状态之前执行,因此,我得到:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.userStore.session.pipe(
map((session) => {
if(session && session.authState == "signedIn") {
this.router.navigate(['/dashboard']);
return false;
}
return true;
})
)
如果,例如,我将BehaviorSubject设置为具有初始值“ null”(或任何其他值),那么Guard将认为用户未登录,因此允许访问。
如何仅在设置了BehaviorSubject的初始值后(即,一旦authStateChanges $ observable发出了它的值)就公开它?