Правила безопасности Firestore: использование hasOnly по запросу для проверки обновления только определенного поля - PullRequest
0 голосов
/ 03 февраля 2019

Я настраиваю свои правила безопасности Firestore, но сталкиваюсь с одной проблемой, в которой я хочу ограничить обновление только одного определенного поля в документе с помощью функции hasOnly.Проблема в том, что я продолжаю получать «отклоненные» результаты, используя симулятор.Я, безусловно, делаю что-то простое неправильно ... Я пытаюсь предотвратить, чтобы кто-то мог обновить другие поля в документе, кроме update_requested_time, но разрешить им обновлять это конкретное поле.

При использовании примераиз документации Firestore для hasOnly () - ['a', 'b'].hasOnly(['b', 'a']) == true - правило возвращает true.Но при использовании моего собственного это не так, поэтому я предполагаю, что я получаю что-то не так в части request.resource.data.keys().

Определенных правил, нацеленных на поля в конкретном сценарии :

match /scenarios/{scenario} {
      allow read: if true;
      allow update: if request.auth.uid != null
        && request.resource.data.keys().hasOnly(['update_requested_time']) == true;

Отправляемый симулятором запрос (обновление с аутентификацией):

{"__name__":"/databases/(default)/documents/scenarios/test1","data":{"update_requested_time":"2019-02-05T11:00:00.000Z"}}

Мои полные правила:

service cloud.firestore {
  match /databases/{database}/documents {
    match /scenarios/{scenario} {
      allow read: if true;
      allow update: if request.auth.uid != null
        && request.resource.data.keys().hasOnly(['update_requested_time']) == true;
      match /comments/{comment} {
        allow read: if true;
        allow create: if request.auth.uid != null;
        allow delete,update: if request.auth.uid != null && request.auth.uid == resource.data.user;
      }
      match /outputs/{tile} {
        allow read: if true;
      }
      match /mutations/{tile} {
        allow read: if true;
        allow create,update: if request.auth.uid != null;
      }
    }
    match /users/{user} {
      allow read: if true;
      allow update: if request.auth.uid != null && request.auth.uid == user;
    }
  }
}

скриншот правил пожарного депо + симулятор

1 Ответ

0 голосов
/ 03 февраля 2019

request.resource.data не содержит сами данные запроса, но скорее содержит новую версию ресурса после операции записи.Поэтому проверка не удалась.

Документация по Firestore на request.resource:

Новое значение ресурса, присутствующее только в запросах на запись.

...