Firestore规则-查询文档字段而不暴露整个集合

时间:2020-09-25 10:19:07

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

我有一个users集合,其中包含包含各个字段的文档。每个文档ID都是firebase用户ID,并且这些字段保存用户数据。

我正在使用以下规则:

match /databases/{database}/documents {
  // Make sure the uid of the requesting user matches name of the user document.
  match /users/{userId} {
    allow read, update, delete: if request.auth.uid == userId;
    allow create: if request.auth.uid != null;
  }
}

用户可以选择保存在数组字段中的“喜欢的歌曲”。现在,我需要查询数据库,以查找已将某些歌曲添加到收藏夹的用户。我创建了以下查询:

FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference usersRef = db.collection("users");
usersRef.whereArrayContains("favouriteSongs", "id_of_song");

运行查询时,返回以下错误:

com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:缺少权限或权限不足。

我显然需要更改Firestore规则,以允许用户查询“ favouriteSongs”字段;但是,我不想将所有用户数据公开给所有人。

是否可以公开“ favouriteSongs”数据(仅包含ID),并确保限制其余用户集合的读取?

谢谢

1 个答案:

答案 0 :(得分:1)

不幸的是,安全规则位于文档/查询级别。因此,如果安全规则允许访问,则用户将有权访问整个文档。

如果favouriteSongs是唯一可以公开读取的字段,则该字段应位于其他文档中。

有几种选择。您可能有一个名为favoriteSongs的根级别集合,其中的用户文档仅包含公共数据。这样一来,您可以灵活地轻松查找用户的收藏夹,或查询所有数据以查找有多少用户喜欢某首歌曲。

我建议只有用户本人才能阅读自己的文档(涉及隐私等)(如果相关,也可以是GDPR)。

相关问题