新用户无法进行基于Firebase角色的访问

时间:2018-08-31 08:10:26

标签: firebase google-cloud-firestore

我一直在firebase网站上关注用户组的安全数据访问: https://firebase.google.com/docs/firestore/solutions/role-based-access

现在我的角色如下:

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

现在,当我成为管理员时,一切都正常,但是对于没有任何项目且不是管理员的人来说,它不起作用。

我总是缺少或权限不足。 当我在规则模拟器中运行查询时,它会给我:

错误:simulator.rules行[16]的列[18]。空值错误。在此行上:

return rsc.data.roles[request.auth.uid];

我不知道该如何解决? 我试图像这样更改查询:

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

但是,这当然会带来相同的问题,因为不存在带有角色数组的项目。

编辑

我发现,当我在Firebase模拟器中测试规则时,它可以工作。 只是要检索我不是

的所有者|作家|读者的所有项目的查询

屏幕截图数据:

enter image description here

0 个答案:

没有答案