Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase Firestore:更好地了解获取其他文档时安全规则的工作方式_Firebase_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Firebase Firestore:更好地了解获取其他文档时安全规则的工作方式

Firebase Firestore:更好地了解获取其他文档时安全规则的工作方式,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我真的在挖掘Firestore,但很难找到具体问题的答案,所以我来了。这只是为了确保我正确理解了安全规则的工作原理:) 以下是我的模式: /databases/{database}/documents/Bases/Base1 { roles: { // map user1: {admin: true} }, Items: { // SubCollection item1: { name: "Hello World"

我真的在挖掘Firestore,但很难找到具体问题的答案,所以我来了。这只是为了确保我正确理解了安全规则的工作原理:)

以下是我的模式:

/databases/{database}/documents/Bases/Base1 {
   roles: { // map
      user1: {admin: true}
   },
   Items: { // SubCollection
      item1: {
        name: "Hello World"
      },
      ...n,
      item10: {
        name: "Good Bye World"
      }
   }
}
我想让我的
user1
获取Base1中的所有10项。查询非常简单
db.collection('base').doc('Base1').collection('Items').get()

但我还想确保user1是Base1中的管理员。因此,我要设置以下安全规则:

match /bases/{baseId}/items/{itemId}{
     allow read: if request.auth != null
       && get(/databases/$(database)/documents/bases/$(baseId)).data.roles[request.auth.id].admin == true
}
这很有效,很好。以下是问题:

1/我知道这个规则get()会花费我一读(我知道这很便宜)。需要验证的是每个查询读取一次还是每个文档读取一次?在我的情况下读10

2/我假设1/的答案是它将花费10次阅读。但是,由于我总是查询相同的$(baseId),缓存将启动,即使不能保证,它也会大大减少收费读取的数量(理论上,即使我获取1000个文档,也会读取1次)

欢迎提供关于如何处理此类模式的任何其他建议。我知道阅读操作非常便宜,但我想知道我要去哪里:)

非常感谢:)

安全规则中的
get()
成本只适用于每个查询一次。它不适用于获取的每个文档

由于您有一个查询,因此需要一次读取。

根据您的需要,您可以在用户auth上使用customClaims,这将花费您零次读取-但是空间有限,因此声明需要简单,如“{admin:true}”或{admin:“managedAccountID”}。有额外的操作复杂性(声明必须由安全节点管理,如CloudFunction),但它是完全安全的。