1

我正忙于学习 Angular + Firebase,但遇到了一个问题。我有一组用户和一个角色。我正在使用为用户生成的 ID 来存储我的角色数据。这是一个屏幕截图:

Firebase 快照

我想使用 canActivate 功能来管理谁可以编辑什么数据。如何检查用户是否将 admin 字段设置为 true?我可以通过以下方式获取用户的角色文档:

this.afs.collection('roles').doc(id).valueChanges()

我可以像这样在 HTML 中显示数据:

*ngIf="roles$ | async as roles"

但是,我想用它来验证用户是否具有管理员权限。

4

1 回答 1

0

您将不得不使用take(1)orfirst()运算符仅从 firebase 流中获取第一个发射。守卫CanActivate期望完成:Observable

export interface UserRoles {
  admin: boolean;
  editor: boolean;
  subscriber: boolean;
}

@Injectable({
  providedIn: 'root'
})
export class IsAdminGuard implements CanActivate {
  constructor(private auth: AngularFireAuth, private afs: AngularFirestore) {}

  canActivate(): Observable<boolean> {
    return this.auth.user.pipe(
      switchMap((user) => !user?.uid
        ? of(false)
        : this.afs.doc<UserRoles>(`roles/${user.uid}`).valueChanges().pipe(
            map((roles) => !!(roles?.admin))
          )
      ),
      take(1)
    );
  }
}
于 2020-08-11T14:13:19.343 回答