如何在Firebase规则中检查具有未知密钥的现有数据的值?

时间:2014-07-18 08:33:18

标签: firebase firebase-security

使用Firebase安全规则,如何检查同级值以确定newData是否有效?

在我的应用中,每个game都有moves列表。这个游戏是1405584062293

http://i.imgur.com/Eu4B1Qt.png

当提交新动作时,我想参考已经播放的动作来验证它。对于初学者来说,玩家应该只能进行每一秒的移动(玩家可以在索引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或类似的解决方案,但是现在我想知道如何实现这些以及其他如此简单的规则。

2 个答案:

答案 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不再将其视为数组,而是带有数字键的对象。