#firebase #google-cloud-firestore #firebase-security
#firebase #google-cloud-firestore #firebase-безопасность
Вопрос:
В моем редакторе Firebase -> Database -> Rules у меня есть правило соответствия для write
op в курсе, которое проверяет, является ли status
свойство либо:
- Не определено, что означает, что свойство просто отсутствует в реквизитах модели, или
- Установить, со значением «черновик» или «завершено»
Чтобы зафиксировать это, я написал следующее:
match /courses/{courseId} {
allow write: if (resource.data.status == 'undefined' ||
resource.data.status != 'completed');
}
То есть a write
разрешено, если у курса нет status
свойства или свойство не равно «завершено».
Со второй частью условия проблем нет, проблема в том, что первая часть всегда вызывает типичную ОШИБКУ FirebaseError: отсутствуют или недостаточно разрешений.
Я попробовал каждый из следующих вариантов для первой части, но безуспешно:
resource.data.status == null
resource.data.status == undefined
resource.data.status == 'undefined'
typeof(resource.data.status) == undefined
typeof(resource.data.status) == 'undefined'
И ===
это просто синтаксически недопустимо в редакторе. Есть идеи, как протестировать отсутствующие свойства и получить правильное значение true / false?
Ответ №1:
Недавно мне понадобилось это в проекте, и я придумал эту функцию:
function isNotExisting(request, resource, key) {
return !(key in request.resource.data) amp;amp; (!exists(resource) || !(key in resource.data));
}
Основной трюк заключается в использовании key in resource.data
или key in request.resource.data
, который проверяет, существует ли данный ключ в документе после или до операции.
Комментарии:
1. Имеет смысл, как только я прочитаю ваш ответ! Переписывание проблемной части, как
!('status' in resource.data)
это было сделано для меня! Спасибо, Фрэнк 🙂