Angular / Firestore — Защита маршрута для экрана входа в систему — можно ли проверить пользователя, который пытается получить доступ к маршруту?

#angular #google-cloud-firestore #angular-route-guards

#angular #google-cloud-firestore #angular-route-guards

Вопрос:

У меня есть приложение angular и защита маршрута.

Если пользователь завершает работу во domain.com/login время входа в систему, я хотел бы перенаправить его на другой маршрут.

Однако у одной учетной записи пользователя есть атрибут ‘admin’ в firestore ( admin: true ). После входа в систему я выполняю проверку login.component.ts, чтобы узнать, существует ли этот узел Firestore в учетной записи пользователя. Если это произойдет, я перенаправлю их на панель администратора. Если этого не происходит, это указывает на то, что это входящий клиент, и перенаправляет их на другой компонент.

Однако проблема, с которой я сталкиваюсь на данный момент, заключается в том, что я не уверен, как перенаправить пользователя на соответствующий компонент, если он окажется на экране входа в систему во время входа в систему. Ниже пока моя защита. Как вы можете видеть, в навигации по маршрутизатору есть знак вопроса, так как я не уверен, как определить, администратор это или нет.

 export class LoginGuardService implements CanActivate {

   constructor(
     private router: Router,
     private auth: AngularFireAuth
   ) { }

   canActivate(): Observable<boolean> {
     return this.auth.authState.pipe(
       map(authState => {
         if (authState) {this.router.navigate(['/?']);}
         return !authState;
       }),
       take(1)
     )
   }
}
  

Комментарии:

1. Я считаю, что ‘authState’ в вашем коде должен быть экземпляром firebase. Пользователь firebase.google.com/docs/reference/js/firebase . Пользователь

Ответ №1:

Это сработало для меня:

 export class LoginGuardService implements CanActivate {

constructor(
  private router: Router,
  private auth: AngularFireAuth
) { }

canActivate(): Observable<boolean> {
  return this.auth.authState.pipe(
    map(authState => {
      if (authState amp;amp; authState.email.endsWith('@domain.com')) {
        this.router.navigate(['/admins']);
      } else {
        if (authState ) {
          this.router.navigate(['clients']);
        }
      }
      return !authState;
    }),
    take(1)
  )
}
}