基于字段值的Firestore规则

问题描述 投票:0回答:1

我对这些规则不熟悉,有些基本内容我不明白。以下规则不起作用:

service cloud.firestore {
  match /databases/{database}/documents {
    match /usernames/{username} {
      allow read: if true;
      allow write: if request.auth != null;
    }
    match /users/{userId} {
      allow read, write: if request.auth != null;
    }
    match /universes/{universe}/{document=**} {
      allow read, write: if request.auth != null && 
        get(/databases/$(database)/documents/universes/$(universe)).data.isPublic == true;
    }
  }
}

但是,如果我将 $(universe) 替换为现有文档的名称(基本上是对其进行硬编码),它确实有效吗?!我以为 $(universe) 为所讨论的宇宙的名称提供了一个变量,但是唉!!

不适用于 $(universe) 但适用于硬编码文档名称的查询是:

FirebaseFirestore.instance.collection('universes').snapshots()

如果设置为 $(universe) 与现有文档名称,则会出现以下错误:

W/Firestore(27925):(25.0.0) [Firestore]:监听查询(target=Query(universe order by name);limitType=LIMIT_TO_FIRST)失败:状态{code=PERMISSION_DENIED,描述=缺失或不足权限。,原因=null}

我想要的是有人能够在公共宇宙中读取或写入任何文档。谢谢!

firebase google-cloud-firestore firebase-security
1个回答
0
投票

Firestore 安全规则不是过滤器。 请仔细阅读该文档以了解该问题。

您的查询正在询问 Universes 集合中的所有文档,没有过滤器。 但是,您似乎希望规则根据内容过滤掉某些文档。 安全规则不是这样运作的。规则无法从查询结果中过滤文档。 他们只能确保对查询应用了适当的过滤器。

如果您想要获取

isPublic
为 true 的 Universe 中的所有文档,您将需要在查询本身上应用该过滤器,以便满足规则的要求:

FirebaseFirestore.instance
    .collection('universes')
    .where("universes", isEqualTo: true)
    .snapshots()
© www.soinside.com 2019 - 2024. All rights reserved.