В 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» может быть изменен без каких-либо проблем.
спасибо за любые подсказки в правильном направлении.