Правило безопасности Firestore работает в симуляторе, но не работает в приложении - PullRequest
0 голосов
/ 26 июня 2018

У меня проблема с этим правилом безопасности Cloud Firestore:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stages/{stageId} {
      match /collections/{collectionId} {
        match /pois/{poiId} {
          allow read;
          allow write: if request.auth != null || 
            request.method == "update" && 
            request.resource.data.keys() == ["pm"];
          }

        }

    }    
  }
}

В коде я пытаюсь обновить поле pm существующего документа как неаутентифицированный пользователь со словарем значений. Журнал Firestore показывает этот запрос:

2018-06-26 12:46:05.476997+0100 app[59292:3472939] 5.3.0 - [Firebase/Firestore][I-FST000001] FSTWriteStream 60c000107230 mutation request: <GCFSWriteRequest 0x60c0006e9e00>: {
    writes {
      update {
        name: "projects/myApp/databases/(default)/documents/stages/dev/collections/ETzbIXBn0Z5FOsCHtHlv/pois/zJELKLTWupuMkYQNb9gl"
        fields {
          key: "pm"
          value {
            map_value {
              fields {
                key: "subLocality"
                value {
                  string_value: "Albufeira"
                }
              }
              fields {
                key: "locality"
                value {
                  string_value: "Albufeira"
                }
              }
              fields {
                key: "country"
                value {
                  string_value: "Portugal"
                }
              }
              fields {
                key: "postalCode"
                value {
                  string_value: "8200-142"
                }
              }
              fields {
                key: "adminArea"
                value {
                  string_value: "Faro"
                }
              }
              fields {
                key: "timezone"
                value {
                  string_value: "Europe/Lisbon"
                }
              }
              fields {
                key: "thoroughfare"
                value {
                  string_value: "Rua Primeiro de Dezembro"
                }
              }
              fields {
                key: "name"
                value {
                  string_value: "Rua Primeiro de Dezembro"
                }
              }
              fields {
                key: "isoCountryCode"
                value {
                  string_value: "PT"
                }
              }
            }
          }
        }
      }
      update_mask {
        field_paths: "pm"
      }
      current_document {
        exists: true
      }
    }
    stream_token: "\031\020hB\002\201\364\265\265"
}

Этот запрос не выполняется с "отсутствующими или недостаточными разрешениями".

Когда я моделирую update до stages/dev/collections/ETzbIXBn0Z5FOsCHtHlv/pois/zJELKLTWupuMkYQNb9gl с этими смоделированными данными

{"__name__":"/databases/(default)/documents/stages/dev/collections/ETzbIXBn0Z5FOsCHtHlv/pois/zJELKLTWupuMkYQNb9gl","data":{"pm":{"adminArea":"Germany","testArea":"Munich"}}}

симулятор разрешает обновление.

В своем коде (проект Swift / iOS) я использую метод updateData для ссылки на существующий документ.

В качестве параметра я передаю этот массив:

["pm": ["adminArea": "Faro", "name": "Rua Primeiro de Dezembro", "postalCode": "8200-142", "locality": "Albufeira", "subLocality": "Albufeira", "isoCountryCode": "PT", "timezone": "Europe/Lisbon", "thoroughfare": "Rua Primeiro de Dezembro", "country": "Portugal"]]

Есть идеи, что я делаю не так? Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

Вы можете переписать это

request.resource.data.keys() == ["pm"];

с

request.writeFields == ["pm"];
0 голосов
/ 27 июня 2018

Как оказалось

request.resource.data.keys() == ["pm"];

не работал должным образом при развертывании (хотя он работал в симуляторе).

Замена на

request.writeFields.size() == 1 && "pm" in request.writeFields;

помог мне.

Имитация правил - отличный шаг к пригодному для использования продукту (Привет, Google: правила отладки ???), но только если они работают в симуляторе так же, как и в реальном развертывании ...

...