小编ame*_*n73的帖子

Firestore 规则:resource.data.keys() 不包含读取中的所有字段

设置


我在 Firebase Firestore 中有一个集合,其中包含以下字段:

(["active" , "created" , "description" , "displayName" , "expires" , "image" , "type" , "uid" , "userName"])
Run Code Online (Sandbox Code Playgroud)

其中"expires"是可选的。

写入规则确保每个对象都遵循该形式并成功测试。

问题


当尝试从集合中读取时,我有一条规则,规定如下:

let seeUnexpired = !("expires" in resource.data.keys()) ||
resource.data.expires > request.time ||
request.auth.uid == resource.data.uid;
Run Code Online (Sandbox Code Playgroud)

这禁止除作者之外的用户阅读过期的条目。然而,这条规则并不禁止读取。我正在使用带有精心策划的数据的本地模拟器进行测试,并且确信过期字段存在并且对于此测试来说已经过时。

细节


在尝试调试时,我发现导致规则失败的条件是!("expires" in resource.data.keys())

运行测试并debug(resource.data.keys())打印此对象firestore-debug.log

list_value {
  values {
    string_value: "active"
  }
}
Run Code Online (Sandbox Code Playgroud)

where"active"仅在请求中使用此查询条件时显示:...collection('collection_name').where('active', '==', true).get()

这对我来说仅包括读取请求的子句resource.data.keys()中引用的资源中的字段。where这意味着请求可以通过简单地将其不包含在查询中来规避“字段不得存在”规则。

调试:

Mar 31, 2021 12:34:48 PM …
Run Code Online (Sandbox Code Playgroud)

security firebase firebase-security google-cloud-firestore

7
推荐指数
1
解决办法
1153
查看次数