0

我正在使用 BehaviorSubject 在登录时存储用户信息。出于某种奇怪的原因,BehaviorSubject 返回的用户信息null位于为我的端点激活的 AuthGuard 中。请帮助我了解我错过了什么。

我已经尝试将主题返回为可观察的,订阅主题 ReplaySubject。似乎没有任何效果,并且用户信息在身份验证保护中始终为空。我已经在 app 模块和服务组件之间移动了 AuthService 提供者声明。那也没有帮助。在调用 auth guard 之前,设置用户信息的流程是正常的。一旦调用 auth guard,用户信息就会丢失。

用户注册:这是用户登录的步骤

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

login组件:该组件设置用户信息

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();
  }

auth guard:这里的用户信息为空

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;
  }

预期:返回当前用户信息 实际:返回 null

4

2 回答 2

1

我会说你的canActivate方法中问题的根源在于,在被调用的那一刻,你仍然没有用户的信息,并且当你BehaviorSubject值初始化时,这正是你得到的.

我不会返回值,而是将 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;
}

希望对你有帮助!

;)

于 2019-10-29T21:09:45.647 回答
1

感谢大家。所有评论都很有帮助,我的问题是身份验证服务正在我的导航组件中初始化。这就是它总是具有空值的原因。这个答案帮助我朝那个方向思考:Cannot pass data with service in angular2

于 2019-10-30T18:00:31.967 回答