【问题标题】:Check References in Array - Firestore Security Rules检查数组中的引用 - Firestore 安全规则
【发布时间】:2020-07-23 04:22:16
【问题描述】:

我正在为我的应用程序构建 Firestore 安全规则,在 events 集合中,我有一个名为 members 的属性,其中包含来自 users 集合的引用数组。我将如何确保发送请求的用户在该集合中?我知道我可以通过 request.auth.uid 获取 userId,但我不知道如何在 firestore 规则中获取文档引用并确保该引用在数组中。

【问题讨论】:

  • 如果您编辑问题以显示到目前为止您所拥有的规则并不能按您期望的方式工作,这将很有帮助。尝试一下,即使它不起作用,并显示你卡在哪里。

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


【解决方案1】:

我找到的答案是这样的:

match /events/{eventId} {
  allow read: if /databases/$(database)/documents/users/$(request.auth.uid) in resource.data.members;
}

看起来in 关键字允许我检查一个值是否在数组中,/databases/$(database)/documents/users/$(request.auth.uid) 创建一个 DocumentReference,它是存储在数组中的数据类型。

【讨论】:

    【解决方案2】:

    正如其他帖子 here 中所阐明的,与您的类似,Firestore 规则不是用于过滤数据,而是用于设置哪些数据可供哪些用户访问以及哪些查询可以执行。

    考虑到这一点,您需要编写代码来查询和比较来自request.auth.uid 的数据与来自您的子集合的ids。这样,您将能够确认您想要的数据,即请求被授权访问信息的用户。这将是处理请求并返回或不从数据库中返回信息的正确方法。

    确认请求用户在members 子集合中的简单代码示例类似于以下几行:

    var user = firebase.auth().currentUser;
    db.collection("events").where("members", "array-contains", user.uid).get()
    

    虽然此代码未经测试,但这是您需要做的事情的起点,以确保允许请求的用户检索信息。您可以通过here获取更多信息。

    如果这些信息对您有帮助,请告诉我!

    【讨论】:

    • 感谢您的解决方案,但我的想法是,我不希望事件集合中的文档中不属于 members 条目的人能够访问该事件文档.
    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多