Целостность RuleDataSnapshot из-за одновременной записи - PullRequest
0 голосов
/ 03 октября 2019

Источник

Тогда, если / 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, видимый обеими операциями, все еще имеет начальные значения. Следовательно, правило записи для удаления и записи оценивается как истинное. Следовательно, ожидаемое поведение не получено.

Как противостоять этому сценарию?

[Примечание: использование транзакций не является безопасным вариантом, поскольку прошедший проверку подлинности пользователь может сознательно смоделировать этот сценарий и завершить работу приложения]

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