Firestore 阻止用户及其帖子

时间:2021-06-23 20:26:50

标签: ios swift firebase google-cloud-firestore

我有一个社交媒体应用程序,它的 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;
    }
  }
}

我只想阅读未被我屏蔽的用户的帖子。但是这些规则并不能正常工作。

感谢任何帮助!谢谢

1 个答案:

答案 0 :(得分:0)

这最终取决于您如何阅读文档,因为条件读取要求用户有权访问集合中的所有文档以从其中列出/获取文档。请参阅:Security Rules are not Filters

您将不得不在客户端过滤文档,但要真正阻止用户阅读,您必须维护每个用户的文档 ID 索引集合及其帖子 ID,并使用集合组查询读取它们以为每个用户找到相关的帖子 ID 并手动提取帖子,而不是简单地抓取您的帖子。

https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

相关问题