Firestore 安全规则:使用array_contains确定授权

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

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

{
    .
    "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();
}

答案 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)。


答案 2

推荐