Проверка данных Firestore на количество записываемых параметров - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть 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 голосов
/ 29 сентября 2018

Вы должны использовать переменную resource, как вы уже делаете.

Со свойством data resource вы получите rules.Map, т. Е. Карту данных документа.

Тип Map имеет методы keys() и size(), см. https://firebase.google.com/docs/reference/rules/rules.Map.

Затем вам просто нужно проверить, что:

request.resource.data.size() == 2

и

, что keys соответствуют EmailAddress и CostPrice.Для этого вы будете использовать hasOnly() метод keys, поскольку метод keys() возвращает rules.List, см. https://firebase.google.com/docs/reference/rules/rules.List.. Сделайте следующее:

request.resource.data.keys().hasOnly(['EmailAddress', 'CostPrice']) == true
...