Firestore规则-在哪里存在使用

时间:2019-07-16 08:31:35

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

在我的项目中,我有用户和类的Firestore集合。每个用户都可以属于一个或多个类。类文档具有属性成员,该属性成员是一个数组,其中包括该类中的所有用户uid。

例如:

users documents:
doc.id: USER1UID
{ name: 'user1', email: 'user1@user1.com', phone: '+123 456 789 001' }

doc.id: USER2UID
{ name: 'user2', email: 'user2@user2.com', phone: '+123 456 789 002' }

doc.id: USER3UID
{ name: 'user3', email: 'user3@user3.com', phone: '+123 654 789 003' }

classes documents:
doc.id: ABCDEF
{ name="class1", members: ['USER1UID', 'USER2UID'] }

doc.id: GHIJKL
{ name="class2", members: ['USER1UID', 'USER3UID'] }

doc.id: MNOPQR
{ name="class3", members: ['USER3UID'] }

我需要编写一条规则,允许用户仅在同一个类中读取有关另一个用户的详细信息。每个用户也可以阅读自己的个人资料。

在这种情况下,用户1可以读取用户2和用户3的详细信息。 (它们在class1和class2中在一起)。 User2仅可以读取user1的详细信息(它们在class1中在一起)。 User3只能读取user1的详细信息(它们在class2中在一起)。

我需要类似的东西:

match /users/{userId} {
   allow read: 
     //user is logged in
     if request.auth != null 
     && (
            //user can read own profile
            request.auth.id == $(userId)

            //there is a class where are both (requesting and requested) users
            || exists( (/databases/$(database)/documents/classes/).where(request.auth.id in members).where($(userId) in members)
        )
}

1 个答案:

答案 0 :(得分:1)

数据库架构无法实现您要尝试执行的操作,因为安全规则不允许您执行查询。您一次只能使用其已知路径请求一个文档,每个规则执行最多10个文档。

您可以做的是管理每个用户文档,使其包含具有与该用户相同的类的所有其他用户的列表。但是您将不得不编写一些代码来保持最新,因为类的名册可能会随着时间而改变。这对于Cloud Functions可能是一个很好的用途。