【问题标题】:Firestore Security Rules: use array_contains to determine authorizationFirestore 安全规则:使用 array_contains 来确定授权
【发布时间】:2019-03-17 07:18:56
【问题描述】:

我可以在 Firebase 安全规则中使用 array_contains 的等效项吗?

我有一个Event 类(对应于events 集合中的Event 文档)。每个文档都有一个subscribers 列表/数组,其中包含应该能够查询此事件的所有用户的 UID:

{
    .
    "subscribers" : ["uidA", "uidB", "uidC"],
    .

}

更明确地说,用户应该能够运行查询:

db().collection("events").whereArrayContains("subscribers", "uidC");

如何编写此安全规则?

我试过了:

match/events/{eventId} {
    allow list: if request.auth.uid in resource.data.subscribers;
}

模拟器告诉我访问将被拒绝。

使用这样的函数也会报告访问被拒绝:

function isSubscriber() {
    return resource.data.subscribers.includes(request.auth.uid);
}

match/events/{eventId} {
    allow list: if isSubscriber();
}

【问题讨论】:

  • 您在控制台模拟器之外尝试过这些吗?已知存在一些问题。
  • 在我看来,控制台无法准确模拟列表类型规则,因为它只适用于查询,您不能在模拟器中进行查询。您是否尝试过在客户端应用程序中进行实际查询,而不是在模拟器中?
  • 控制台外没试过。它没有显示语法错误,但由于我在文档中没有找到类似的示例,我不知道它是否会起作用。我试试看。
  • 你是对的(谢谢!),if request.auth.uid in resource.data.subscribers; 规则实际上确实有效。但是,in 运算符没有记录(通过另一个 SO 问题找到)。我可以在哪里举报?
  • in 运算符已记录在案,所有列表操作也是如此:firebase.google.com/docs/reference/rules/rules.List

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


【解决方案1】:

感谢@DougStevenson 的建议,我使用了规则:

match/events/{eventId} {
    allow list: if request.auth.uid in resource.data.subscribers;
}

然后让我的 Android 开发人员实际尝试从他的设备进行查询,结果成功了!

不要盲目相信 Firestore 安全规则的模拟器,它可能与现实不同!!!模拟器的代码可能与为实际评估生产中的规则而部署的代码不同,因此结果可能略有不同。

Firebase 安全规则文档:https://firebase.google.com/docs/reference/rules/rules.List(显然它也适用于 Firestore)。

【讨论】:

猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2019-08-20
  • 2020-03-22
  • 2018-07-07
  • 2018-10-19
  • 2019-07-05
相关资源
最近更新 更多