Проверка подлинности роли Firebase Angular - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь создать аутентификацию пользователя с помощью Firebase.

У меня есть две роли в моем приложении: ученик и учитель, которые я добавляю в коллекцию Firebase с именем users при регистрации, где есть роль поля .

Моя проблема в том, что я хочу перенаправить ученика на страницу профиля ученика, а учителя - на страницу профиля учителя. У меня есть две разные формы, одна для входа ученика и одна для входа учителя.

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

Теперь я не получаю никаких ошибок, если бы у меня была только одна форма входа, все работало бы правильно, но у меня было две, поэтому я хочу, чтобы она выдала мне ошибки, если пользователь является учителем и входит в систему. для студентов.

Это мой логин для студентов в моем auth.service

    loginEmailStudent(email: string, pass: string) {
        return new Promise((resolve, reject) => {
            this.auth.signInWithEmailAndPassword(email, pass)
            .then( (user) => {
                this.afs.collection("users").ref.where("email","==", user.user.email).onSnapshot(snap => {
                    snap.forEach(userRef => {
                        if(userRef.data().role == "student"){
                            this.router.navigate(['/student/profile']);
                        } else {
                            //error                   
                        }
                    })
                })
            }).catch(err => console.log(reject(err)));
        });
    }

То же самое для loginTeachers, кроме роли. И это в моем компоненте авторизации, где отправка формы для входа студентов.

onSubmit(form: NgForm) {
    if(!form.valid) {
      return
    }
    const email = form.value.email;
    const password = form.value.password;
    this.isLoading = true;
    if(this.isLoginMode) {
      this.authService.loginEmailStudent(email, password)
      .then( (res) => {
      this.isLoading = false;
      }).catch(errorRes => {
        console.log(errorRes);
        switch(errorRes.code) {
          case 'auth/user-not-found' :
            this.error = 'There is no existing user with this email address!';
            break;
          case 'auth/wrong-password' :
            this.error = 'The password is invalid!';
            break;
          case 'auth/invalid-email' :
            this.error = 'The email address is badly formatted!';
            break;
          default:
            this.error = 'An error occured!';
        }
        this.isLoading = false;
      });
    } else {
      this.authService.registerStudent(email, password)
      .then((res) => {
        this.isLoading = false;
        this.authService.isAuth().subscribe( student => {
          if(student) {
            student.updateProfile({
              displayName: '',
              photoURL: this.inputImageUser.nativeElement.value
            }).then( () =>  {
              this.onLoginStudentRedirect();
            }).catch( (error) => console.log('error', error));
          }
        });
      }).catch(errorRes => { 
        console.log(errorRes);
        switch(errorRes.code) {
          case 'auth/email-already-in-use' :
            this.error = 'The email address is already in use by another account!';
            break;
          case 'auth/invalid-email' :
              this.error = 'The email address is badly formatted!';
              break;
          default:
              this.error = 'An error occured!';
        }
        this.isLoading = false;
      });
    }
    form.reset();
  }

1 Ответ

0 голосов
/ 30 апреля 2020

Первый вариант:

Почему у вас нет простого login метода для ученика и учителя, который разрешит объект, который имеет свойство ученика или учителя? .

На вашем методе onSubmit вы можете соответствующим образом справиться с обработкой ошибок.


Второй вариант

- сохранить почти все то же самое, но вместо использования перенаправления (this.router.navigate(['/student/profile']);) в методе login вы выдаете указанную ошибку c. И вы ловите эту указанную c ошибку внутри onSubmit.

...