【问题标题】:Custom security rules for Cloud FirestoreCloud Firestore 的自定义安全规则
【发布时间】:2018-07-23 20:15:49
【问题描述】:

我想创建一个 Cloud Firestore 实时数据库,其中包含用户可以加入的群组并与群组中的其他成员共享信息。我想保持用户匿名,所以我认为它的实现方式是:

  • 群组创建者生成格式为 XXXX-XXXX-XXXX-XXXX 的群组密钥
  • 想要加入的人必须有他们在应用程序中输入的组密钥,之后他们应该能够读取创建更新 该组中的数据

所以基本上数据结构是这样的:

/groups/ : [
    //groups as documents
    "ABCD-0000-0000-0001" : { /*group data model*/ }
    "ABCD-0000-0000-0002" : { /*group data model*/ }
    "ABCD-0000-0000-0003" : { /*group data model*/ }
]

问题是,我应该编写什么安全规则以允许用户仅在他们所属的组中读取创建更新数据到(有它的组键)?同时,如何禁止用户查看其他组的key?

【问题讨论】:

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


    【解决方案1】:

    您可以将组 ID 保存在用户的个人资料中。然后创建一个规则,如果该组 ID 存在,则只允许 CRU 权限。

    db.collection.('users').doc({userId}.update({
      ABCD-0000-0000-0001: true
    })
    
    match /groups/{groupId} {
      allow read, create, update: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.$(groupId) == true;
    }
    

    【讨论】:

      【解决方案2】:

      您的组结构可以保持原样-

      groups (Collection) : [
          //groups as documents
          "ABCD-0000-0000-0001" : { /*group data model*/ }
          "ABCD-0000-0000-0002" : { /*group data model*/ }
          "ABCD-0000-0000-0003" : { /*group data model*/ } ]
      

      为了保持访问权限,您可以拥有另一个名为 group_users 的单独集合 as-

      group_users(Collection)/ <group_id>(Document)/ members(Collection)/ :
             uid_1 (document)
             uid_2 (document)    
             ...
      

      现在允许的规则可以是-

      service cloud.firestore {
        match /databases/{database}/documents { 
          match /groups/{group_id} {
              allow read, create, update: if exists(/databases/$(database)/documents/group_users/$(group_id)/members/$(request.auth.uid));
          }
        }
      }
      

      当成员加入群组时,您必须将用户的 uid 添加到该新集合中-

      group_users/<group_id>/members
      

      对于管理员来说,你可以有一个类似的集合,并且在管理员创建组时会添加uid-

      group_users/<group_id>/admins
      

      您可以在组内拥有一个集合作为替代方案,而不是在组集合之外有一个单独的集合,然后您将不得不在某种程度上修改组数据模型。

      另外,仅供参考,安全规则中的每个 exists () 调用都计费(可能作为一次读取操作)。

      here 是一份详细的文档,解释了 Firestore 安全规则的几乎所有可能方面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2021-12-02
        • 2020-11-27
        相关资源
        最近更新 更多