BehaviorSubject в угловом возвращении null - PullRequest
0 голосов
/ 30 октября 2019

Я использую BehaviorSubject для хранения информации о пользователе при входе в систему. По какой-то странной причине пользовательская информация, возвращаемая BehaviorSubject, в AuthGuard null активируется для моей конечной точки. Пожалуйста, помогите мне понять, что я упускаю.

Я уже пытался вернуть предмет в качестве наблюдаемого, подписаться на предмет, ReplaySubject. Кажется, ничего не работает, и пользовательская информация всегда пуста в auth guard. Я переместил объявление поставщика AuthService между модулем приложения и компонентом службы. Это также не помогло. До тех пор, пока вызов не перейдет в режим проверки подлинности, поток будет нормальным, если задана информация о пользователе. Как только вызывается защита аутентификации, информация о пользователе теряется.

user reg: На этом шаге пользователь входит в систему

 onSubmit() {
    this.document.location.href = environment.callbackUrl;
  }

компонент входа: этот компонент устанавливает информацию о пользователе

this.authService.setUserInfo(user);
if (user.id_token!=null && user.role!=null && user.isLoggedIn){
  this.router.navigate(['/view-main/datalogger-list']);
}

служба проверки подлинности

userSubject: BehaviorSubject<UserInfo> = new BehaviorSubject<UserInfo>(null);

setUserInfo(user: UserInfo){
  if(user && user !=null){
    this.userSubject.next(user);
  }
}

getUserInfo() {
    return this.userSubject.asObservable();
  }

защита проверки подлинности: здесь информация о пользователе имеет значение null

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    debugger
    let userInfo:UserInfo;

    this.authService.getUserInfo().subscribe(user => {
      console.log('Evaluating in auth guard');
      console.log('User: ', user);
      //if user is logged in and role info is available from database.
      if(user && user!=null 
          && user.role!=null && user.role.trim().length>0 
          && user.wwid!=null && user.wwid.trim().length>0){
        // allow user
        userInfo = user;
        return true;
      }
      // TO-DO user logged in but do not have information from database -How i will knwo this?
      else if(user && user!=null 
              && user.wwid!=null && user.wwid.trim().length>0
              && (user.role==null || user.role=='undefined') ){
        this.router.navigate(['welcome']);
        return false;
      }else{
        // redirect user to oidc urls
        this.router.navigate(['welcome']);
        return false;
      }
    })
    return false;
  }

Ожидается: Возвращает текущую информацию о пользователе. Actual: Возвращает null

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Я бы сказал, что корень вашей проблемы в вашем canActivate методе в том, что в данный момент вызывается, у вас все еще нет информации о пользователе, и, поскольку вы инициализировали BehaviorSubject с помощью null value, это именно то, что вы получите.

Вместо того, чтобы возвращать значение, я бы возвратил userSubject в качестве Observable и подписался бы на него в вашем canActivate методе:

userSubject: BehaviorSubject<UserInfo> = new BehaviorSubject<UserInfo>(null);
 setUserInfo(user: UserInfo){
    if(user && user !=null){
      this.userSubject.next(user);
    }
  }
 getUser() {
    return this.userSubject.asObservable();
  }

И охранник:

 canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

    let userInfo:UserInfo;  
    this.authService.getUser().subscribe(user => userInfo = user);
    return true;
}

Надеюсь, что вам поможет!

;)

0 голосов
/ 30 октября 2019

Спасибо всем. Все комментарии были полезны, и моей проблемой была инициализация службы авторизации в моем компоненте nav. И это причина, по которой он всегда имел нулевое значение. Этот ответ помог мне подумать в этом направлении: Невозможно передать данные со службой в angular2

...