Firestore:如何设置基于阵列的安全规则?

时间:2018-11-24 10:20:52

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

我正在开发一个可以跟随/取消关注其他应用程序用户的应用程序。因此,在Firestore中,我有一个用户集合,每个用户都包含一个名为followers的属性。 Followers是一组userId。

赞:

"users": {
    "user1": { 
        "name": "Jack", 
        "imageUrl": "http://lorempixel.nl",
        "followers": ["user1", "user2"]
    }
}

问题

如何在Firestore中编写安全规则,因此只有当前用户才能读取/写入自己的对象,而其他用户则可以将其用户ID添加/删除到关注者数组中。

1 个答案:

答案 0 :(得分:1)

要使人们能够关注/取消关注用户,这组安全规则应适用于您的数据结构。基本表示他们不能更改其他数据,并且有3条规则:

  1. 允许他们添加自己,这意味着用户可以将其uid添加到关注者列表,但不能删除其他人
  2. 允许他们删除自己的uid,但没有其他人
  3. 如果他们在遵循文档后立即更新文档,则无法对其进行修改。

    service cloud.firestore {
    
        match /databases/{database}/documents {
    
            match /users/{userId} {
            allow update: if 
                resource.data.name == request.resource.data.name &&
                resource.data.imageUrl == request.resource.data.imageUrl &&
                request.resource.data.size() == resource.data.size() &&
                ( 
                    (
                        // If user adding their uid
                        request.resource.data.followers.hasAll(resource.data.followers) &&
                        request.resource.data.followers.hasAll([request.auth.uid]) &&
                        request.resource.data.followers.size() == resource.data.followers.size() + 1
                    ) || 
                    (
                        // If user removing their uid
                        resource.data.followers.hasAll(request.resource.data.followers) &&
                        resource.data.followers.hasAll([request.auth.uid]) &&
                        !request.resource.data.followers.hasAll([request.auth.uid]) &&
                        request.resource.data.followers.size() == resource.data.followers.size() - 1
                    ) || 
                    (
                        // If user tries updating whilst already a follower
                        request.resource.data.followers.hasAll(resource.data.followers) &&
                        request.resource.data.followers.size() == resource.data.followers.size()
                    )
                )
            }
        }
    }
    

我已经在Firebase控制台的规则模拟器中对其进行了测试,因此应该可以正常工作,但请进行广泛的测试。感觉很hacky,拥有支持阵列删除的特定规则绝对是一件好事,但我相信这同时应该做到。