在身份验证保护流程中正确使用重播主题

时间:2019-04-09 21:05:57

标签: angular oauth-2.0 angular-ui-router observable rxjs6

我想向登陆组件添加身份验证保护。我正在努力了解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对象?

任何帮助,

0 个答案:

没有答案