基本的firestore安全规则:exists()工作 - 为什么get()没有?

时间:2017-10-10 10:30:13

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

我正在尝试根据另一个文档验证firestore中的读取。

数据结构由2个集合组成:“执行”和“测试”。

在测试集合中,只有一个文档,具有以下ID:SRJKCxU4HVDBdB3qyfzG,以及theese值:

admin true id: "SRJKCxU4HVDBdB3qyfzG" test: 1

我的安全规则如下所示:

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

    function testFunction(testId) {
      // return exists(/databases/$(database)/documents/test/$(testId));
      return get(/databases/$(database)/documents/test/$(testId)).data.id == "SRJKCxU4HVDBdB3qyfzG";
    }

    match /execution/{exeid} {
      allow read, write: if testFunction("SRJKCxU4HVDBdB3qyfzG");
    }

  }
}

如果我使用return exists(/databases/$(database)/documents/test/$(testId));,一切都按预期工作。但无论如何我都无法让这条线工作return get(/databases/$(database)/documents/test/$(testId)).data.id == "SRJKCxU4HVDBdB3qyfzG"

我真的希望我错过简单明了吗?任何帮助都很常见。如有必要,我还创建了一个demo firebase项目和stackblitz。

感谢您的帮助。

更新 - 临时解决方案 由于firestore安全规则错误,因此不会填充data属性。这将是固定的。 get()工作的临时解决方案如下:

get(path).data.prop || get(path).prop

2 个答案:

答案 0 :(得分:3)

setOffScreenPageLimit尚不存在,这就是为什么你不能这样做的原因。

答案 1 :(得分:3)

根据this Stack Overflow question,Firebase安全规则目前存在错误:

  

因为错误是未填充数据对象,所以应检查这两个属性。启动这个bug的解决方案没有ETA ..

临时解决方案是将代码更改为:

{{1}}