isAdmin исчезает из базы данных Firebase RealTime при входе в систему с учетной записью администратора - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь установить маршруты администратора, используя базы данных Angular и Firebase в реальном времени, чтобы пользователи с правами администратора могли получить доступ к определенным частям сайта. Я установил isAdmin: true для учетной записи администратора. Однако после входа в систему с учетной записью администратора isAdmin становится красным и удаляется автоматически.

app-user.ts

export interface AppUser{
    name: string;
    isAdmin: boolean;
    email: string;

}

user.service.ts

constructor(private db: AngularFireDatabase) { }

  save(user: firebase.User){
    this.db.object('/users/' + user.uid).set({
      name: user.displayName,
      email: user.email
    });
  }

  get(uid: string): Observable<any>{
    return this.db.object('/users/'+uid).valueChanges();
  }

auth.service.ts

export class AuthService {
  user$: Observable<firebase.User>;

  constructor(private afAuth: AngularFireAuth, private route: ActivatedRoute, private userService: UserService) {
    this.user$=afAuth.authState;
   }

  login(){
    let returnUrl = this.route.snapshot.queryParamMap.get('returnUrl') || '/';
    localStorage.setItem('returnUrl', returnUrl);

    this.afAuth.auth.signInWithRedirect(new firebase.auth.GoogleAuthProvider);
  }

  logout(){
    this.afAuth.auth.signOut();
  }

  get appUser$(): Observable<AppUser> {
    return this.user$.pipe(
      switchMap((user) => {
        if (user) {
          return this.userService.get(user.uid);
        } else {
          return of(null);
        }
      })
    );
  }
}

auth-guard.service.ts

export class AuthGuard implements CanActivate {

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

  canActivate() {
      return this.auth.user$.pipe(map(user => {
      if(user) return true;

      this.router.navigate(['/login']);
      return false;
    }));

  }
}

admin-auth-guard.service.ts

export class AdminAuthGuardService implements CanActivate {

  constructor(private auth: AuthService, private userService: UserService) { }

  canActivate(): Observable<boolean> {
    return this.auth.user$.pipe(switchMap((user: firebase.User) =>
        this.userService.get(user.uid)),
        map((appUser) => appUser.isAdmin));
      }


  }

1 Ответ

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

После нескольких часов редактирования кода я наконец нашел решение. До сих пор, сохраняя пользователя в базе данных реального времени, я использовал метод set для хранения пользовательских данных, из-за которых isAdmin исчезал при каждом входе администратора.

user.service.ts

export class UserService {

  constructor(private db: AngularFireDatabase) { }

  save(user: firebase.User){
    this.db.object('/users/' + user.uid).update({
      name: user.displayName,
      email: user.email

    });
  }

  get(uid: string): Observable<any>{
    return this.db.object('/users/'+uid).valueChanges();
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...