我有一个社交媒体应用程序,它的 firestore 结构中有以下集合:
UserActivity
--- Post 1 id
--- Post 1 data
--- Post 2 id
--- Post 2 data
--- Post n id
--- Post n data
这里的“UserActivity”是一个帖子集合,其中包含文档中带有 id 和键值对的文档。其中一个键是“userRef”,其中包含用户的 id,即其帖子所在。
现在我想屏蔽用户,一旦用户被屏蔽,就不应该看到他/她的帖子。跟踪被屏蔽用户的结构是:
Blocked
--- User id 1
--- "Blocked user 1 id" : true
--- "Blocked user 2 id" : true
--- "Blocked user n id" : true
--- User id 2
--- "Blocked user 1 id" : true
--- "Blocked user 2 id" : true
--- "Blocked user n id" : true
“Blocked”是集合的名称。用户 id 是其中包含密钥对的文档,说明哪个用户已被该特定用户阻止。例如:用户 ID 1 阻止了另一个用户 ID 2 的用户。
现在我正在应用这些安全规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /UserActivity/{activity} {
allow read: if request.auth != null && !exists(/databases/$(database)/documents/Blocked/$(request.auth.uid)/$(request.resource.data.userRef)+'/true');
allow write: if request.auth != null;
}
}
}
我只想阅读未被我屏蔽的用户的帖子。但是这些规则并不能正常工作。
感谢任何帮助!谢谢
答案 0 :(得分:0)
这最终取决于您如何阅读文档,因为条件读取要求用户有权访问集合中的所有文档以从其中列出/获取文档。请参阅:Security Rules are not Filters
您将不得不在客户端过滤文档,但要真正阻止用户阅读,您必须维护每个用户的文档 ID 索引集合及其帖子 ID,并使用集合组查询读取它们以为每个用户找到相关的帖子 ID 并手动提取帖子,而不是简单地抓取您的帖子。
https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query