Правила безопасности Firestore: обновить правило безопасности документа - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь написать правило безопасности, которое позволяет добавлять значения только определенного типа.

Это то, что у меня сейчас:

allow update if 
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.sessionID == key2
    // THIS CHECKS IF THE USER IS ALLOWED TO UPDATE THIS DOCUMENT

    && request.resource.data.description is string
    && request.resource.data.endMo is number

    && request.resource.data.startMo is number

    && request.resource.data.openMO is bool

    && request.resource.data.pdf is string

    && request.resource.data.Adress == resource.data.Adress //USER can't update this field

    && request.resource.data.size() <= 40; 

Это работает, если все поля уже заполнено.

СИТУАЦИЯ 1 -> РАБОТЫ

оригинал сделать c

{
'description': 'helloworld',
'endMo': 12,
'startMo': 6,
'openMo': true,
'pdf': 'url',
'adress': 'myAdress',
}

 db.collection("myCol").doc("myDoc").update({  
    'description': 'helloworld2',
    }

СИТУАЦИЯ 2 -> НЕ РАБОТАЕТ

оригинал do c

   {
    'adress': 'myAdress',
    }

  db.collection("myCol").doc("myDoc").update({  
    'description': 'helloWorld',
    }

Почему правило не допускает добавление значений и только обновление уже существующих значений?

1 Ответ

1 голос
/ 09 марта 2020

Имейте в виду, что request.resource.data всегда содержит все полей в документе после успешного обновления. Это включает в себя все существующие поля в документе.

Обновление в ситуации работает, потому что новое содержимое документа удовлетворяет всем условиям.

Это обновление во второй ситуации не работает, потому что это сбой всех проверок для полей, которые еще не существуют в документе, а также не предоставляются в обновлении. Если вы хотите, чтобы эта вторая ситуация работала, вам придется кодировать правила так, чтобы пропавшие поля фактически не требовались с указанными c типами, такими как они есть сейчас.

...