使用Firestore规则,我试图确保作为地图对象的传入请求仅具有1个条目(即只有1个键)。使用.size()== 1总是会导致权限不足,而使用.size()> 1总是正确的。
请求来自此:
const batch = this.db.firestore.batch();
batch.update(frameUserRef, {
[`users.${this.authService.currentUser.uid}.pictureCount`]: firebase.firestore.FieldValue.increment(1)
});
batch.commit();
我正在尝试使用诸如
之类的Firestore规则request.resource.data.users.keys().size() == 1
// NOTE: This doesn't work either
request.resource.data.users.size() == 1
但是,这永远不会如我所料。我试图阻止某人在此通话中附加其他更新,即
const batch = this.db.firestore.batch();
batch.update(frameUserRef, {
[`users.${this.authService.currentUser.uid}.pictureCount`]: firebase.firestore.FieldValue.increment(1),
[`users.${ANOTHER_USER_ID_HERE}.pictureCount`].pictureCount: 100000 // MALICIOUS REQUEST
});
batch.commit();
我做错什么了吗?还是我误解了.size()函数?任何信息表示赞赏。
编辑:经过更多测试,看来.size()
是Firestore中当前地图的大小(即地图已经有4个条目,我正尝试仅更新1和.size()== 4)。它似乎不是来自请求,就像我想request.resource.data
从中提取...。
有人对此有见识吗?