android - 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)并确保限制读取用户集合的其余部分?
谢谢
解决方案
遗憾的是,没有,安全规则是在文档/查询级别。因此,如果安全规则允许访问,则用户将有权访问整个文档。
如果favouriteSongs
是唯一可以/应该公开阅读的字段,那么该字段应该在不同的文档中。
有几种选择。您可以有一个根级集合favoriteSongs
,其中包含仅包含公共数据的用户文档。这将使您可以灵活地轻松查找用户的最爱,或查询所有数据以找出有多少用户喜欢一首特定的歌曲。
我建议只有用户自己可以阅读它自己的文档,涉及隐私等(如果相关,可能是 GDPR)。
推荐阅读
- javascript - 我该如何延迟javascript执行?
- codenameone - 代号一个事件侦听器,用于再次在前台重新启动应用程序?
- sql - 将值设置为常量时应该添加 WHERE 吗?
- powershell - 如何使用 Powershell 向本地 Outlook 联系人添加证书?
- android - 匕首与包裹发生冲突
- python-3.x - 如何将python列表中的重复项变为零
- javascript - 通过 express 处理 jwt 令牌返回错误“const token = req.cookies.auth; [0] ^ [0] [0] ReferenceError: req is not defined”
- git - 如何在没有结帐的情况下获取另一个分支中的文件列表
- haskell - 如何解决此异常:threadWait:无效参数(错误文件描述符)执行 [haskell]?
- python - 在 python 中停止 bash 脚本