Firestore:删除文档上的敏感字段

时间:2017-11-14 07:27:33

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

我试图找出如何删除firestore文档上的敏感字段。例如,我的收藏是一个群组信息。该组受PIN码字段保护。任何想加入该组的人都必须知道密码。

与此同时,我想让用户查询可以加入的群组。对于查询部分,我不希望返回具有密码信息的组信息。无论如何,我们是否要从Firestore文档中删除敏感字段以便阅读事件?

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

我的群组架构是:

group: {
    name: string,
    pinCode: string
}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

或者(并且更安全)您可以为私人文档创建单独的集合。

答案 1 :(得分:0)

您可以创建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集合时仅填充所需的字段。