Источник
Тогда, если / users / barney / active содержит значение true, пользователь, аутентифицированный с помощью идентификатора «barney», может записать в узел / comments
Мое дополнительное обязательное поведение: / пользователь / барни / активный может быть удалено, только если нет данных в / comments
Обновленное правило:
{
"rules": {
"comments": {
".read": "root.child('users').child(auth.uid).child('active').val() == true"
}
"users/barney": {
".write": "!(root.child('comments').exists())"
}
}
}
Контрольный пример: / пользователь / барни / активный содержит истину и / комментарии пусто (без данных)
Операция: / comments пишется одним клиентом и одновременно / user / barney / active удаляется другим клиентом
Сценарий: оценка правила выполняется одновременно. Таким образом, root RuleDataSnapshot, видимый обеими операциями, все еще имеет начальные значения. Следовательно, правило записи для удаления и записи оценивается как истинное. Следовательно, ожидаемое поведение не получено.
Как противостоять этому сценарию?
[Примечание: использование транзакций не является безопасным вариантом, поскольку прошедший проверку подлинности пользователь может сознательно смоделировать этот сценарий и завершить работу приложения]