我在 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)