首页 > 解决方案 > Firestore:更好地了解获取其他文档时安全规则的工作原理

问题描述

我真的在挖掘 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('Bases').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() 会让我读一读(我知道这很便宜)。是每个查询读取一次还是每个需要验证的文档读取一次?IE。就我而言,读了 10 次。

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

欢迎任何其他关于如何处理这些模式的建议。我知道读取操作非常便宜,但我想了解我要去哪里:)

谢谢所以:)

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


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

由于您有一个查询,因此将花费一读。


推荐阅读