проблемы с правилами безопасности пожарного депо - PullRequest
0 голосов
/ 23 марта 2019

У меня могут быть некоторые проблемы с синтаксисом правил безопасности пожарного депо, потому что я думаю, что логика, лежащая в основе структуры моей базы данных, правильная, а также правила безопасности должны быть правильными.

Итак, структура выглядит следующим образом. У меня есть коллекция «пользователей», они либо покупатели, либо продавцы (о часах говорят). И есть коллекция "часов". Внутри часов продавцы могут создавать документы, которые содержат данные о часах, а также идентификатор продавца.

Документ внутри "watches" имеет вложенную коллекцию под названием "status". Внутри «статуса» находится один документ, в этом документе есть поле, которое также называется «статус», его значение равно 0 или 1, 0 означает, что он доступен (для покупки), а 1 означает, что он кем-то зарезервирован. Правила безопасности: только создатель контрольного документа может изменить этот документ, и (любой) покупатель может изменить статус, только если статус был 0.

Я думал, что следующее должно сделать работу

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{$uid} {
      allow read, update: if request.auth.uid == $uid;
    }
    match /watches/{watchId} {
     allow read: if true;
     allow update: if request.resource.data.sellerId == request.auth.uid;
     match /status/{statusId} {
        allow read: if true;
      allow update: if request.resource.data.status == 0 && request.auth != null;
     }
    }
  }
}

Я провел несколько симуляций, но это никогда не позволяло мне вносить изменения в статус (я вошел в систему, и статус был 0). Что-то не так с кодом?

1 Ответ

2 голосов
/ 24 марта 2019

Это правило:

allow update: if request.resource.data.status == 0 && request.auth != null;

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

allow update: if request.auth != null               // user is auth'd
              && resource.data.status == 0          // existing value is 0
              && request.resource.data.status == 1  // new value is 0

Обратите внимание на разницу между resource.data, который является существующими данными документа, request.resource.data, который является новыми данными документа.

...