我有一个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),并确保限制其余用户集合的读取?
谢谢
答案 0 :(得分:1)
不幸的是,安全规则位于文档/查询级别。因此,如果安全规则允许访问,则用户将有权访问整个文档。
如果favouriteSongs
是唯一可以公开读取的字段,则该字段应位于其他文档中。
有几种选择。您可能有一个名为favoriteSongs
的根级别集合,其中的用户文档仅包含公共数据。这样一来,您可以灵活地轻松查找用户的收藏夹,或查询所有数据以查找有多少用户喜欢某首歌曲。
我建议只有用户本人才能阅读自己的文档(涉及隐私等)(如果相关,也可以是GDPR)。