我一直在寻找答案,
简而言之,我有一个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集合中创建了两个文档(代表用户)。
现在,我尝试通过模拟器“Update”方法写入具有提到的security.rule的锦标赛表中(当然提供了身份验证凭据)
从BlockList中删除用户“8Zvq1fpWl2S0h1t7bIxNoxDcucn1”并再次使用模拟器时,我得到:
摘要:在我看来,它工作得很好。