#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)
)
}
}