【问题标题】:Firestore: remove sensitive fields on documentsFirestore:删除文档上的敏感字段
【发布时间】:2017-11-14 07:27:33
【问题描述】:

我正在尝试弄清楚如何删除 Firestore 文档中的敏感字段。例如,我的收藏是一个群组信息。该组受密码字段保护。任何想加入群组的人都必须知道密码。

同时,我想让用户查询可以加入的组。对于查询部分,我不想返回带有密码信息的组信息。我们是否必须从文档中删除敏感字段以供 Firestore 读取事件?

云功能只支持写事件。一种可能的解决方案是在写入事件上使用云功能,并将 pin 码放在单独的文档中。有更好的解决方案吗?谢谢。

我的组架构是:

group: {
    name: string,
    pinCode: string
}

【问题讨论】:

  • 您应该将安全敏感值与不同的集合分开。由于 Firestore 的 get 方法无法获取具有选择性字段的对象。

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


【解决方案1】:

用户可以访问文档,也可以不访问。 Firestore 中没有属性级别的访问控制。

因此,要完成您想要的,您需要将公共和私人信息存储在单独的文档中。

您可以使用同一集合中的私人信息创建第二个文档,然后使用以下方法保护它们:

match /databases/{database}/documents {
    match /groups/{group} {
      allow read: if resource.data.visibility != "private"
    }
}

或者(并且更容易保护)您可以为私有文档创建一个单独的集合。

【讨论】:

    【解决方案2】:

    您可以创建一个仅返回您需要的字段(非敏感)的 Firebase 函数,这里是一个示例:

    exports.getTopUsers = functions.https.onCall(async (data) => {
       const users = [];
       return db.collection('users').orderBy('bids').limit(data.limit).get()
       .then((querySnapshot) => {
          querySnapshot.forEach((user) => {
             users.push({
                diplayName: user.get('displayName'),
             });
          });
          return {
             topUsers: users,
          };
       })
       .catch((err) => {
          console.error(err);
       });
    });
    

    因此,您需要创建一个单独的数组(将被返回)并在迭代 Firestore 集合时仅使用您想要的字段填充它。

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 2020-09-11
      • 2021-12-31
      • 1970-01-01
      • 2020-10-31
      • 2019-11-25
      • 2021-09-29
      • 2018-07-28
      相关资源
      最近更新 更多