使用Firebase安全规则,如何检查同级值以确定newData
是否有效?
在我的应用中,每个game
都有moves
列表。这个游戏是1405584062293
:
当提交新动作时,我想参考已经播放的动作来验证它。对于初学者来说,玩家应该只能进行每一秒的移动(玩家可以在索引0
开始玩甚至移动,玩家2可以玩奇数动作)。
由于每个移动的键是一个未知的随机字符串(根据this recommendation in the docs),我不知道如何检查前一个移动。我也不知道如何计算现有动作的数量。
这是我的结构:
{
"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或类似的解决方案,但是现在我想知道如何实现这些以及其他如此简单的规则。
答案 0 :(得分:1)
并非每个用例都适合用于管理通用列表的单一推荐方法。当然不是你的。您可能会在an incremental ID方法中找到更多用途。
由于您无法对子记录键/值进行包含,因此您将保留一个可以递增的值。例如,利用上面的增量ID方法,我可以编写一个安全规则,以确保我写入奇数键(并且只在我的回合中),如下所示:
".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()"
答案 1 :(得分:0)
只要您不撤消移动(例如从Firebase中的列表中删除移动),将其存储为数组(imo)就没有错误。
如果从数组中删除元素,则会出现问题,因为索引中的数字将被跳过,Firebase不再将其视为数组,而是带有数字键的对象。