【发布时间】: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