Как использовать правила безопасности Firebase, как я могу проверить значения newData
чтобы определить, действительно ли newData
?
В моем приложении в каждой game
есть список moves
. Тут игра 1405584062293
:
Когда новый шаг отправлен, я хочу проверить его со ссылкой на ходы, которые уже были воспроизведены. Во-первых, игрок должен иметь возможность играть только каждый второй ход (игрок может сыграть даже ходы, начиная с индекса 0
, два игрока могут играть нечетные ходы).
Поскольку каждый ключ перемещения является неизвестной случайной строкой (согласно этой рекомендации в документах), я не знаю, как проверить предыдущий ход. Я также не знаю, как подсчитать количество существующих ходов.
Здесь моя структура:
{
"rules":{
".read":true,
"games":{
"$game":{
"moves":{
"$move":{
".write":"auth !== null",
// Something along these lines would get me going...
".validate":"data.parent().keys.count % 2 == 0"
}
}
}
}
}
}
На самом деле правила игры намного сложнее, и я ожидаю, что мне нужно будет использовать Firesafe или подобное решение, но сейчас я хотел бы знать, как достичь этих и других таких простых правил.
Не каждый вариант использования может вписаться в единый рекомендованный подход для управления общими списками. Конечно, не твой. Вероятно, вы найдете больше использования в инкрементном ID- подходе.
Так как вы не можете делать записи о дочерних записях/значениях, вы будете поддерживать значение, которое может быть увеличено. Например, используя описанный выше инкрементный подход, я мог бы написать правило безопасности, чтобы убедиться, что я пишу нечетные ключи (и только на моем ходу) следующим образом:
".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()"
Пока вы не отменяете ходы (например, удаляете перемещения из списка в Firebase), нет ничего плохого в том, чтобы хранить его как массив (imo).
Проблемы возникают, если вы удаляете элемент из массива, потому что тогда число в индексах будет пропущено, а Firebase больше не будет рассматривать его как массив, а объект с номерами для ключей.