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

时间:2018-04-30 10:26:39

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

在firestore安全规则中,resource.data总是一个emtpy对象,这是一个bug还是什么?

我的火库规则:

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

我的javascript:

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

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

  } else {

  }
}) 

这是我当前的数据库快照 image

解决了:

thanks for Frank's answer

问题依赖于当我们查询多个文档时,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()

1 个答案:

答案 0 :(得分:2)

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

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

这样的东西
function lcmN(ns)
    let rv := 1;
    for n in ns
        rv := lcm2(rv, n);
    return rv;

请注意,这确实需要文档具有db.collection('/hospitals') .where("name", ">=", "") .get() .then(printResult) 字段,否则名称不能为空。

有关详细信息,请参阅: