首页 > 解决方案 > Firestore 规则 - 查询文档字段而不暴露整个集合

问题描述

我有一个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)并确保限制读取用户集合的其余部分?

谢谢

标签: androidgoogle-cloud-firestorefirebase-security

解决方案


遗憾的是,没有,安全规则是在文档/查询级别。因此,如果安全规则允许访问,则用户将有权访问整个文档。

如果favouriteSongs是唯一可以/应该公开阅读的字段,那么该字段应该在不同的文档中。

有几种选择。您可以有一个根级集合favoriteSongs,其中包含仅包含公共数据的用户文档。这将使您可以灵活地轻松查找用户的最爱,或查询所有数据以找出有多少用户喜欢一首特定的歌曲。

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


推荐阅读