Firestore Data验证要写入的参数数量

时间:2018-09-29 06:39:44

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

我有一个HashMap,其中有2个参数要添加到Firestore Database中。

    FirebaseFirestore mFirestore=FirebaseFirestore.getInstance();    
    Map<String,Object> userItemsMap=new HashMap<>();    
            userItemsMap.put("EmailAddress",user.getEmail());
            userItemsMap.put("CostPrice",thaliBO.getCostPrice()); 
 mFirestore.collection("Maharashtra/411057/"+user.getUid()).add(userItemsMap)
                    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                        @Override
                        public void onSuccess(DocumentReference documentReference) {
                            String str="hi";
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    String str="hi";
                }
            });

我正在使用Firestore规则验证数据,

service cloud.firestore {
  match /databases/{database}/documents {
    match /{state}/{zip}/{uid}/{document=**} {  
allow write: if request.resource.data.CostPrice>0 &&
request.resource.data.EmailAddress.size()<30 
        }
      }
   }

我担心有人使用反向工程向userItemsMap添加更多参数,例如

userItemsMap.put("PhoneNUmber","123456789");

将存储在firestore中,这会消耗不必要的内存。

firestore中是否有任何数据验证规则可以防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

您应该像以前一样使用resource变量。

使用data的{​​{1}}属性,您将获得resource,即文档数据的映射。

rules.Map类型具有Mapkeys()方法,请参见https://firebase.google.com/docs/reference/rules/rules.Map

然后,您只需检查一下即可:

size()

request.resource.data.size() == 2 对应于keysEmailAddress。为此,您将使用CostPrice的{​​{1}}方法,因为hasOnly()方法返回keys,请参见https://firebase.google.com/docs/reference/rules/rules.List。因此,请执行以下操作:

keys()