Firestore规则对象数据类型

Ale*_*oci 4 firebase firebase-security google-cloud-firestore

数据库有一个集合"Collection",集合中的每个文档都有一个对象"members",其中包含可以访问该文档的用户的"uid".

Collection--->document-->members = {"BZntnJO2PVS8OZ9wctwHiyxBytc2": true} 
Run Code Online (Sandbox Code Playgroud)

我尝试了许多不同类型的规则,但这些规则似乎都不起作用

service cloud.firestore {
  match /databases/{database}/documents {
  match /collection/{documentId} {
         allow read: ****
 }
}
Run Code Online (Sandbox Code Playgroud)

1)

allow read: if get(/databases/$(database)/documents/collection/$(documentId)).members[request.auth.uid] != null
Run Code Online (Sandbox Code Playgroud)

2)

allow read: if resource.data.members[request.auth.uid] != null
Run Code Online (Sandbox Code Playgroud)

3)

allow read: resource.members[request.auth.uid] != null
Run Code Online (Sandbox Code Playgroud)

4)

allow read: if request.resource.data.members[request.auth.uid] != null
Run Code Online (Sandbox Code Playgroud)

5)

allow read: request.resource.members[request.auth.uid] != null
Run Code Online (Sandbox Code Playgroud)

它可以是Firestore的bug吗?

Tod*_*man 6

您需要访问该data属性以获取任何用户创建的属性,因此规则1,3和5将不起作用.

request.resource通常是指您向数据库发送的数据,通常是在写入操作的情况下,因此规则#4将不起作用,因为request.resource.data在读取的情况下可能是空的.

规则#2确实看起来正确,但请记住,这仅适用于获取单个文档的情况.查询有点棘手.

具体来说,如果您运行的是"获取我的收藏中的每个文档"这类查询,Cloud Firestore没有时间搜索数据库中的每条记录以确保您的用户具有访问权限,因此它将拒绝此操作查询.相反,您需要运行一个查询,其中Cloud Firestore可以"证明"您检索的所有文档都是有效的.例如,在您的情况下,您需要确保您的查询类似于"在我的集合中获取成员的每个文档.(userID)!= null".然后,Cloud Firestore规则可以将您的查询与其规则进行比较,并感到满意的是您只能获得您有权访问的文档.