检查阵列中的引用-Firestore安全规则

时间:2020-07-23 04:22:16

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

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

2 个答案:

答案 0 :(得分:0)

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

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

一个简单的代码示例将确认发出请求的用户位于members子集合中,类似于以下几行:

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

虽然此代码未经测试,但这是您需要执行的操作的起点,以确保允许请求用户的用户检索信息。您可以获得有关here的更多信息。

让我知道信息是否对您有帮助!

答案 1 :(得分:0)

我找到的答案是这样:

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,它是存储在数组中的数据类型。