新用户基于Firebase角色的访问失败

新用户基于Firebase角色的访问失败,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我关注firebase网站上用户组的安全数据访问: 现在我的角色如下: service cloud.firestore { // Roles admin = 0, owner = 1, writer = 2, reader = 3 match /databases/{database}/documents { function isSignedIn() { return request.auth != null; } func

我关注firebase网站上用户组的安全数据访问:

现在我的角色如下:

service cloud.firestore {
// Roles admin = 0, owner = 1, writer = 2, reader = 3
  match /databases/{database}/documents {

        function isSignedIn() {
          return request.auth != null;
      }

      function isAdmin() {
            return isSignedIn() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 0
      }

    match /projects/{project} {

        function getRole(rsc) {
          return rsc.data.roles[request.auth.uid];
        }

        function isOneOfRoles(rsc, array) {
          return isSignedIn() && (getRole(rsc) in array);
        }

        function canRead() {
            return isAdmin() || isOneOfRoles(resource, [1, 2, 3])
        }

        function canWrite() {
            return isAdmin() || isOneOfRoles(resource, [1, 2])
        }


      allow read: if canRead();
      allow write: if canWrite();
    }
  }
}
现在,当一个新用户被创建时,他不是管理员,也没有项目。 所以实际上他应该能够创建一个新项目,并且他的项目列表应该是空的

我正在执行此查询以检索所有项目:

  getAllProjectsForUser(): Observable<Project[]> {
    return from(this.fireStore.collection('projects').snapshotChanges().pipe(map((data => {
      const projects: Project[] = [];
      data.forEach((doc) => {
        projects.push(new Project(doc.payload.doc.id, doc.payload.doc.data()['projectName'], doc.payload.doc.data()['companyName']));
      });
      return projects;
    }))));
  }
我不知道怎么才能解决这个问题? 我尝试如下更改查询:

  getAllProjectsForUser(uuid: string): Observable<Project[]> {
    return from(this.fireStore.collection('projects').ref.where('roles.' + uuid, '<', 4).get()).pipe(map((data => {
      const projects: Project[] = [];
      data.forEach((doc) => {
        projects.push(new Project(doc.id, doc.data()['projectName'], doc.data()['companyName']));
      });
      return projects;
    })));
  }
getAllProjectsForUser(uuid:string):可观察{

从(this.fireStore.collection('projects').ref.where('roles.'+uuid')返回,它发生在新创建的用户或除管理员以外的所有人身上?您是否分配了角色?您是否使用了Firebase Auth?我是否可以查看示例数据(Firebase控制台中的数据截图)我添加了一个屏幕截图。它适用于不是管理员的每个用户。我认为,因为我查询了所有项目和一些项目,角色对象为空,因为它不包含您的uuid。是的,因为项目中没有定义用户及其角色,所以当您执行查询以查找角色时,它总是返回您遇到的问题原因,在这里:rsc.data.roles[request.auth.uid];,它找不到它。因此您没有读取权限。我如何解决这个问题。因为在我看来,我无法使用规则中的if测试来检查它是否为null,然后返回空数组?您是否介意详细说明默认项目访问权限?例如,所有用户都可以查看项目X,无论发生什么。或者,您可以解释用户流开始?比如,我登录,我点击那个,等等。
  getAllProjectsForUser(uuid: string): Observable<Project[]> {
    return from(this.fireStore.collection('projects').ref.where('roles.' + uuid, '<', 4).get()).pipe(map((data => {
      const projects: Project[] = [];
      data.forEach((doc) => {
        projects.push(new Project(doc.id, doc.data()['projectName'], doc.data()['companyName']));
      });
      return projects;
    })));
  }