Firestore安全规则-如何检查FieldValue.increment是否有效?

时间:2019-09-13 02:12:13

标签: javascript firebase google-cloud-firestore firebase-security

我有一个Firebase文档“ posts”集合,每个post文档包含四个字段:“喜欢”,“不喜欢”,“超级”和“总计”。 我使用以下三个数据对象对每个文档执行批量更新:

 var data_like_obj =    {
likes: firebase.firestore.FieldValue.increment(1),
total: firebase.firestore.FieldValue.increment(1)
    }


 var data_dislike_obj =   {
dislikes: firebase.firestore.FieldValue.increment(1),
total: firebase.firestore.FieldValue.increment(-1)
    }


 var data_super_obj =   {
super: firebase.firestore.FieldValue.increment(1),
total: firebase.firestore.FieldValue.increment(4)
    }

我找不到安全性规则,无法检查增量是否有效,即(+ 1,-1或+4),仅此而已。我做了以下安全功能:

function validVote() {
    return ( ( isUpdatingField("super") || isUpdatingField("liked") || isUpdatingField("disliked") ) && isUpdatingField("total") ) &&
  (( isUpdatingField("disliked") && (0 <= (int(incomingData().disliked) - int(existingData().disliked)) && (int(incomingData().disliked) - int(existingData().disliked)) <= 1) ) ||
  ( isUpdatingField("super") && (0 <= (int(incomingData().super) - int(existingData().super)) && (int(incomingData().super) - int(existingData().super)) <= 1) ) ||
  ( isUpdatingField("liked") && (0 <= (int(incomingData().liked) - int(existingData().liked)) && (int(incomingData().liked) - int(existingData().liked)) <= 1) )) &&
  ( incomingData().total == incomingData().super * 4 + incomingData().liked - incomingData().disliked )
  ;
}
// Utility Funcs
function existingData() {
    return resource.data;
}
function incomingData() {
    return request.resource.data;
} 

当我在模拟器上对其进行测试时,该函数可以正常工作,但是模拟器无法提交FieldValue.increment对象。如何验证增量是否合法?

1 个答案:

答案 0 :(得分:1)

控制台模拟器非常有限。它基本上只是一个操场,在这里您可以习惯基本规则。为了进行认真的开发,您应该使用Firebase CLI中的规则模拟器来针对实际查询验证规则:

https://firebase.google.com/docs/firestore/security/test-rules-emulator

您将能够使用实际的FieldValue.increment令牌发出查询,并测试更改是否有效。