【发布时间】:2026-01-27 19:20:07
【问题描述】:
TLDR:在将一些布尔值和嵌套对象写入文档时,firestore 规则中的 request.resource.data.size() 计数是多少?不确定文档中“entries in the map”(https://firebase.google.com/docs/reference/rules/rules.firestore.Resource#data、https://firebase.google.com/docs/reference/rules/rules.Map)是什么意思,在规则模拟器中测试时我的假设似乎是错误的(request.resource.data.keys().size() 的类似问题) .
加长版:在 Firestore 规则中遇到问题,无法按预期更新数据(尽管在规则模拟器中进行了类似的测试)。已将问题范围缩小到可以看到它是检查 request.resource.data.size() 是否等于某个数字的规则。
传递给 firestore update 函数的数据示例如下所示
Object {
"parentObj": Object {
"nestedObj": Object {
"key1": Timestamp {
"nanoseconds": 998000000,
"seconds": 1536498767,
},
},
},
"otherKey": true,
}
时间戳是通过firebase.firestore.Timestamp.now() 生成的。
这在规则模拟器中似乎可以正常工作,但在执行时却不适用于实际数据
let obj = {}
obj.otherKey = true
// since want to set object key name dynamically as nestedObj value,
// see https://*.com/a/47296152/8236733
obj.parentObj = {} // needed for adding nested dynamic keys
obj.parentObj[nestedObj] = {
key1: fb.firestore.Timestamp.now()
}
firebase.firestore.collection('mycollection')
.doc('mydoc')
.update(obj)
在其他一些规则中,我使用了规则request.resource.data.size() == 2,这似乎是导致权限被拒绝错误的规则(因为注释掉这个规则可以让事情再次运行)。会认为,由于对象是使用 2 个(*)键传递的,所以 request.resource.data.size()=2,但这显然不是这种情况(也不是传递对象中的键总数)(类似的问题request.resource.data.keys().size())。因此,对于一个简短的问题,有一个很长的例子。如果有人可以为我澄清这里出了什么问题,那将非常有帮助。
【问题讨论】:
标签: google-cloud-firestore firebase-security