【问题标题】:Firestore: Return only documents where rule condition is metFirestore:仅返回满足规则条件的文档
【发布时间】:2020-11-08 20:05:42
【问题描述】:

当我尝试从集合中检索具有特定属性的所有文档时,我收到 FirebaseError: Missing or insufficient permissions. 错误。需要明确的是,这是在 Firestore 规则级别,而不是应用程序级别 - 我没有在处理 .where() 查询。

我的 firebase 规则目前如下所示:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /projects/{project} {
      allow read: if resource.data.visible == true; // This condition seems to be the problem child
      allow write: if false;
    }
  }
}

我已通过将request.auth != null 替换为request.auth != null 确认导致问题的原因是resource.data.visible == true,在这种情况下不会引发错误并且它会返回所有文档。

这是我的一份文件的截图:

另一个被审查文档的visible 属性设置为false

这是我用来访问 Firestore 的 (JavaScript) 代码:

firebase.firestore().collection('projects').onSnapshot(snap => {
  console.log('snap:', snap);
}, err => {
  console.error(err); // Here's where the error gets thrown
});

如果我需要添加任何其他信息,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    您正尝试使用 Firestore 安全规则作为过滤器,但 security rules are not filters。查询会根据其潜在结果集进行评估,如果它可能返回客户端无权读取的文档,则整个查询将失败。

    但是,您也可以通过在查询中添加必要的约束来解决此问题。例如(我没有测试过这个确切的代码,但这应该接近你需要的):

    firebase.firestore().collection('projects').where("visible", "==", true).onSnapshot()
    

    如果您需要更多详细信息,基本上这个确切的示例(使用受文档上定义其可见性的字段限制的安全规则进行查询)位于the security rules documentation

    【讨论】:

      【解决方案2】:

      Firebase 安全规则不会自行过滤您的数据。相反,他们只是检查您的应用程序执行的任何操作是否符合规则。

      由于您的代码尝试读取所有projects,因此规则会检查是否允许这样做。而且由于规则规定用户只能读取可见的项目,所有项目的读取都会被拒绝。

      当您希望允许对集合中的数据进行部分访问时,您需要编写规则和代码来完成这项工作。在您的情况下,您也需要过滤您的代码。

      firebase.firestore().collection('projects').where('visible', '=', true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        • 1970-01-01
        • 2019-08-02
        相关资源
        最近更新 更多