Я пытаюсь установить маршруты администратора, используя базы данных 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));
}
}