【问题标题】:Cloud Firestore: Problem with rules for my Flutter appCloud Firestore:我的 Flutter 应用程序的规则存在问题
【发布时间】:2021-06-10 21:25:32
【问题描述】:

这是我当前的 Cloud Firestore 规则:https://pastebin.com/rQBacfLm

在这个截图中你可以看到我当前的数据库结构:

这是我的 Flutter 应用程序中的代码,我试图用它来获取“所有者”等于用户 UID 的船流:

_databaseReference.collection("boats").where("owner", isEqualTo: "My UID").snapshots()

我不知道规则中是否存在一般错误,或者它是否与流有关。我认为这可能是规则的问题,但我不知道出了什么问题。有人能发现规则中的错误吗?

这是来自控制台的日志:

W/Firestore(26299): (22.0.1) [Firestore]: Listen for Query(target=Query(boats where owner == # com.google.firestore.v1.Value@628107b8
W/Firestore(26299): integer_value: 0
W/Firestore(26299): string_value: "My UID" order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore(26299): (22.0.1) [Firestore]: Listen for Query(target=Query(boats where share array_contains # com.google.firestore.v1.Value@628107b8
W/Firestore(26299): integer_value: 0
W/Firestore(26299): string_value: "My UID" order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}

重要信息:“我的 UID”只是一个占位符,实际上是我的真实 UID。这不是问题!

【问题讨论】:

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


    【解决方案1】:

    如果

        function isOwner(boatId, db) {
          return get(/databases/$(db)/documents/boats/$(boatId)).data.owner == request.auth.uid;
        }
    

    Owner 字段等于用户身份验证 ID。但是在您的文档的屏幕截图中,它的值 My UID 我认为这不是您正在查询的有效 id。检查这里是否有问题

    【讨论】:

    • 很抱歉造成误解,我故意将它作为占位符放在我的 UID 所在的位置。实际上有我的 UID。
    【解决方案2】:

    正如您在我的 Firestore 规则 (https://pastebin.com/rQBacfLm) 中看到的,这些是从 boats 集合访问文档的条件:

    match /boats/{boat} {
      allow create: if isUser(database);
      allow read, update: if isUser(database) && isShared(boat, database);
      allow read, update, delete: if isUser(database) && isOwner(boat, database);
    }
    

    当我现在执行_databaseReference.collection("boats").where("owner", isEqualTo: "My UID") 时,我收到PERMISSION_DENIED 错误,因为where 需要权限list,该权限包含在权限read 中,但read 权限仅适用于isSharedtrue 的船。因此需要将list 权限添加到allow create 行,以便应用可以搜索用户拥有的船只(.where("owner", isEqualTo: "My UID"))。

    【讨论】:

    • 我看到我对自己问题的回答遭到了反对。对答案的批评是​​什么?有什么问题吗?由于我在规则中使用“列表”,所以一切正常。
    猜你喜欢
    • 2021-06-21
    • 2021-06-13
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多