我想向登陆组件添加身份验证保护。我正在努力了解auth防护和auth服务之间的流程。我的身份验证服务向服务器发出一个http请求,以检查用户是否已登录。到目前为止,如果我将此请求转换为行为主题,它将始终将初始值false发送给身份验证保护。一个人应该如何创建一个重放主题来解决这一问题?我有一些代码,是通过大量的搜索组合而成的,但是我不确定它是如何工作的,或者它是否是正确的方法。
我尝试过行为主题。仅从canActivate返回布尔值。
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) { }
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.authService.isLoggedIn()
.pipe(
map(x => { if (!x) return false } ),
catchError => Observable.create(false)
);
}
}
请原谅任何恐怖,我发现rxjs库很难学习。
export class AuthService {
private authenticatedUser;
constructor(private http: HttpClient) { }
isLoggedIn(): Observable<boolean> {
let subject = new ReplaySubject<boolean>();
if (!this.authenticatedUser) {
this.http.get('/api/current_user').subscribe(res => {
console.log("next: returning true");
this.authenticatedUser = res;
subject.next(true);
}, (err) => {
console.error("next: returning false");
subject.next(false);
});
}
return subject.asObservable()
}
}
我没有使用本地存储。我看到的许多示例都使用此方法。当然这很好,因为这是同步动作。我的流程必须从对服务器的请求开始。
有什么想法或建议吗?流量应该是多少?重播主题是最好的方法吗?无论如何,我可以在其中存储User对象?
任何帮助,