【问题标题】:Firestore: How to setup array based security rules?Firestore:如何设置基于阵列的安全规则?
【发布时间】:2019-04-26 16:26:51
【问题描述】:

我正在开发一款应用,您可以在其中关注/取消关注其他应用用户。所以在firestore中我有一个用户集合,每个用户都包含一个名为followers的属性。 Followers 是一组用户 ID。

像这样:

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

问题

如何在firestore中编写安全规则,这样只有当前用户可以读/写他们自己的对象,但其他人可以将他们的用户ID添加/删除到关注者数组中。

【问题讨论】:

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


    【解决方案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,并且有特定的规则来支持数组删除肯定会很好,但我相信这应该同时做到。

    【讨论】:

    • 谢谢,我从你的例子中学到了很多。我会再测试一下。唯一的缺点是您必须分别检查每个未更改的属性,因此当我添加新属性时,我还必须更新我的安全规则。
    猜你喜欢
    • 2018-04-04
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2018-03-22
    • 2019-09-15
    • 2018-11-27
    • 2019-07-23
    相关资源
    最近更新 更多