检查单个文档未通过身份验证的Firestore规则?

时间:2020-05-16 01:33:17

标签: javascript firebase google-cloud-firestore firebase-security

我认为Firebase Rules可能是一个简单的问题,但是我似乎无法使它正常工作。我有一个“公司”文档,里面有多个子集合。我想建立一个规则来检查“公司”文档中数组中的管理员(每个数组项都是firebase userId的字符串),并允许他们读取/写入该文档的所有子集合。

这是单个公司文档中的数据结构:

company1 {
  admins: ["userid1", "userid2", "userid3"],
}

这是我的火力场规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /companies/{company}/{document=**} {
      allow read, write: if request.auth.uid in get(/databases/$(database)/documents/companies/$(company)).data.admins 
    }
  }
}

下面是一个查询示例,该查询在以下情况下不起作用:

let ref = db.collection("companies");

    //get current users company
    ref
      .where("admins", "array-contains", firebase.auth().currentUser.uid)
      .get()
      .then((snapshot) => {
        snapshot.forEach((doc) => {
          this.company = doc.data();
          this.company.id = doc.id;
      });
    });

我希望我的问题有道理:)

1 个答案:

答案 0 :(得分:0)

我找到了答案,希望它对可能遇到此问题的人有所帮助。

我最终调整了数据结构,以将公司文档ID作为字段包含在用户文档中。然后,我创建了以下规则,以允许用户基于Firebase身份验证来读取/写入自己的用户文档,以及基于用户文档中的字段来读取/写入公司:

service cloud.firestore {
  match /databases/{database}/documents {

    // Allow users to create and edit the document for themselves in the users collection
    match /users/{user} {
      allow read, write: if request.auth.uid == user;
    }

    // Allow users to create a company for themselves upon signup
    match /companies/{company} {
      allow create: if request.auth.uid != null
    }

    match /companies/{company}/{document=**} {
      // Allow users to read/write data on thier own companies
      allow read, write: if company in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companies
    }
  }
}