Firestore 阻止用户及其帖子

Posted

技术标签:

【中文标题】Firestore 阻止用户及其帖子【英文标题】:Firestore blocking users and their posts 【发布时间】:2021-06-23 20:26:50 【问题描述】:

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

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

感谢任何帮助!谢谢

【问题讨论】:

将您的 Firestore 数据树显示为图像。 【参考方案1】:

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

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

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

【讨论】:

以上是关于Firestore 阻止用户及其帖子的主要内容,如果未能解决你的问题,请参考以下文章

获取firestore中每个帖子的用户喜欢和总喜欢的所有帖子列表

获取喜欢帖子 Swift 和 Firestore 的用户列表

Flutter - 从 Cloud Firestore 读取嵌套地图

Java Firestore Android 在查询中使用数组列表来显示来自关注用户的帖子

Java Firestore Android 在查询中使用数组列表来显示来自关注用户的帖子

Firebase Firestore 数据库结构