Правила Firestore: Что, если предоставленный документ не существует, но используется в получении? - PullRequest
0 голосов
/ 03 июля 2019

Рассмотрим этот код:

match /shocking_contents_main_app/{shocking_content_main_app} {  // Do not specify any read/update/delete rules - OK, last check 2019/06/03
    allow create: if request.auth.uid != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.can_report_shocking_content == true 
                            && 
                exists(/databases/$(database)/documents/users/$(request.resource.data.reported_account_id))
                && 
                request.resource.data.reported_login == get(/databases/$(database)/documents/users/$(request.resource.data.reported_account_id)).data.login;
}

Эти правила установлены в контексте сообщения о шокирующем контенте.

Последняя строка проверяет, совпадает ли зарегистрированный логин с идентификатором зарегистрированного пользователя. «Проблема» заключается в следующем: документ $(request.resource.data.reported_account_id) по пути /databases/$(database)/documents/users/ не может существовать. Если он не существует, будут ли правила безопасности Firestore отклонять запрос (ожидаемое поведение)? Другими словами: я должен использовать exists(...)?

Другой пример доступен в первой строке: я проверяю, может ли вошедший в систему пользователь может сообщать о содержимом другого лица (get(/databases/$(database)/documents/users/$(request.auth.uid)).data.can_report_shocking_content == true). Но я не пользуюсь exists(...).

1 Ответ

1 голос
/ 04 июля 2019

Если вызов get() не удался, вся проверка становится ложной. Важно понимать, что даже если только одно условие условия allow не выполнено, все условие не будет выполнено.

Таким образом, это правило вернет true:

allow read: if true || false;

Но следующее правило не будет выполнено:

allow read: if true || get(document_that_does_not_exist);

Если вы хотите получить положительный результат, когда документ не существует, вам действительно нужно проверить, существует ли он, сначала используя exists().

Таким образом, это снова вернет true:

allow read: if true || exists(document_that_does_not_exist);
...