firestore 安全规则 resource.data 为空对象

Jac*_* Ng 3 javascript firebase-security google-cloud-firestore

在 Firestore 安全规则中,resource.data 始终是一个空对象,这是错误还是什么?

我的firestore规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /hospitals/{document=**}{

      // allow read :if resource.data.size() == 0; //this return true, resource.data is an empty object

          allow read :if resource.data.name != null; // this doesn't work
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的javascript:

auth().onAuthStateChanged((user) => { 
  if (user) {

    //db is the firestore instance
    db.collection('/hospitals').get()
      .then(printResult)

  } else {
    
  }
}) 
Run Code Online (Sandbox Code Playgroud)

这是我当前的数据库快照 图片

解决了 :

感谢弗兰克的回答

在我的情况下,当我们查询多个文档时,问题依赖于 firestore 安全性不会评估实际文档值

//this doesn't firestore doesnt' evaluate the documetn
db.collection('hospitals').get()

//this will work ,if you need to compare the actual value
db.document('hospitals/somehospital').get()
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 5

安全规则不会自行过滤数据。它们只是对客户端可以读取的数据强制执行规则。您的客户目前正在尝试阅读所有医院。由于您的安全规则对客户端可以读取的数据有限制,因此它们拒绝此操作。

您需要通过与安全规则匹配的查询读取数据,以确保您的客户端请求的内容不超过安全规则允许的内容。所以像

db.collection('/hospitals')
  .where("name", ">=", "")
  .get()
  .then(printResult)
Run Code Online (Sandbox Code Playgroud)

请注意,这确实要求文档具有name字段,否则名称不能为空。

有关更多信息,请参阅:

  • 来自文档 [有关保护查询的 Firestore 文档](https://firebase.google.com/docs/firestore/security/rules-query) **为了节省您的时间和资源,Cloud Firestore 会根据其潜在结果集评估查询而不是所有文档的实际字段值。** 这是否意味着当我们一次查询多个文档时,firestore 安全规则不会评估每个文档的实际值? (2认同)