我一直在寻找答案,

简而言之,我有一个Android应用,该应用允许用户向Firestore数据库写入数据或从中读取数据

我有一个名为BlockList的集合,该集合用于保存用户uid作为文档名称和一个名为userUid的字段值,该集合的目的是拒绝对应用程序中行为不正常的用户进行任何“仅写”请求。
换句话说,我正在寻找Firestore规则,以允许BlockList中的用户仅读取到应用程序中共享的内容,而拒绝他们尝试进行的所有写操作。

我已经测试了这些规则,但是不起作用,,即使用户不在BlockList上,它也不允许任何读取或写入操作

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
   function isBlackListed() {
      return exists(/databases/$(database)/BlockList/$(request.auth.uid))
    }
    match /{document=**} {
      allow read, write: if request.auth != null && !isBlackListed();
    }
  }
}


----------


rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
         allow write: if !exists(/databases/$(database)/documents/BlockList/$(request.auth.uid))

  }
}

更新

多亏了马克的回答,我才得以使所有事情变得正确
工作规则
 match /Posts/{document=**}{
      allow write :if !exists(/databases/$(database)/documents/BlockList/$(request.auth.uid))
      allow read :if request.auth.uid != null;
}

最佳答案

不知道我是否正确解决了您的问题,查看您到目前为止尝试过的规则可能会有所帮助,但是我认为这应该可行:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      // Make sure a write to all documents is only allowed when
      // the current user has no document in BlockList collection
      allow write: if !exists(/databases/$(database)/documents/BlockList/$(request.auth.uid))
    }
  }
}

我已经在我的Firestore实例中对此进行了测试,对我来说还可以。当然,您很可能需要更好地指定文档,而不是通配符匹配。

只要BlockList集合中有一个以userUid作为doc名称的文档,您在BlockList文档中拥有的数据都没有关系。

我在BlockList集合中创建了两个文档(代表用户)。

android - Firestore封锁的使用者规则-LMLPHP

现在,我尝试通过模拟器“Update”方法写入具有提到的security.rule的锦标赛表中(当然提供了身份验证凭据)

android - Firestore封锁的使用者规则-LMLPHP

从BlockList中删除用户“8Zvq1fpWl2S0h1t7bIxNoxDcucn1”并再次使用模拟器时,我得到:

android - Firestore封锁的使用者规则-LMLPHP

摘要:在我看来,它工作得很好。

10-08 17:28