FireStore позволяют писать только для одного поля - PullRequest
0 голосов
/ 29 августа 2018

В Firestore настроено следующее правило безопасности:

match /ads/{adId} {
 allow read: if true;
 allow write: if (request.auth.uid == request.resource.data.ownerId) ||
              (request.auth != null &&
               request.resource.data.size() == 1 &&
               request.resource.data.keys().hasAll(['markedFavoriteBy'])); 
}

Владелец документа обладает всеми правами на запись, но другие пользователи могут писать только в одно поле, которое называется «отмечен как любимый». Кажется, он работает в симуляторе Firestore, но не в Xcode (с симулятором iPhone). Важно отметить, что путь не идет вниз к полю документа - только к документу. Я знаю, что невозможно привязать правило безопасности к одному полю. Однако с этим обходным путем он все равно должен работать.

Код клиента iOS для обновления поля следующий:

let adRef  =  Firestore.firestore().collection("ads").document(ad.key!)
let value: FieldValue = ad.isFavorite ? FieldValue.arrayUnion([uid]) : FieldValue.arrayRemove([uid])
adRef.updateData([DatabaseKeys.markedFavoriteBy : value]) { (error) in
            if let error  = error {
                print(error.localizedDescription)
            }
        }

Ошибка, выводимая на консоль, конечно: «Отсутствует или недостаточно прав».

Я не могу найти ошибку в коде - это ошибка, которая каким-то образом связана с недавним обновлением iOS Firestore SDK? функции arrayUnion и arrayRemove были добавлены только в этом недавнем обновлении.

Проверка работоспособности: я изменил правило записи на позвольте написать: если истина; Результат: Массив «markFavoriteBy» может быть изменен без каких-либо проблем.

спасибо за любые подсказки в правильном направлении.

1 Ответ

0 голосов
/ 12 сентября 2018

Я не могу воспроизвести весь сценарий, так как не уверен в фактическом содержании вашей базы данных. Однако я подозреваю, что проблема заключается в том, что он не предоставляет разрешения, потому что request.resource.data представляет новую версию всего документа (который будет сохранен после утверждения обновления).

Вы, вероятно, хотите использовать request.writeFields doc

Имейте в виду, что request.writeFields недоступен в симуляторе.

...