我有一个类似的问题,并使用身份验证服务解决了它,我改为使用 BehaviorSubject 来跟踪成员身份验证状态:
public member: Subject<Member> = new Subject<Member>();
private _cachedMember: Member;
private _member$: BehaviorSubject<Member>;
constructor(private _http: Http, private _router: Router) {
}
get member$(): Observable<Member> {
if (!this._cachedMember) {
this.getAuthorizedMember().subscribe();
}
return this._member$.asObservable();
}
private getAuthorizedMember(): Observable<Member> {
// call your auth API and set _cachedMember accordingly:
this._cachedMember = member;
this._member$.next(this._cachedMember);
}
我的 auth.guard.ts canActivate 实现:
canActivate(): Observable<boolean> | boolean {
return this._authService.member$.map(member => {
if (member) return true;
else {
// Set entry url
var currentUrl: URL = new URL(this._document.location.href);
this._authService.entryUrl = currentUrl.pathname;
this._router.navigate(['/']);
return false;
}
});
}
else 语句保存了 url 请求,因此会员登录后被正确重定向。
然后,如果 _cachedMember 为空,您只需要调用您的身份验证 API。请记住在注销时将 _cachedMember 设置为 null 并通知主题。
logout() {
this._cachedMember = null;
this._member$.next(this._cachedMember );
}
[编辑] 我发现早期解决方案存在问题。将授权机制包装在可观察对象中是一个好主意,如果 _member$ 主题已分配,则进行空检查。如果直接导航到受保护的路线,则初始状态是有效的!