【问题标题】:How can I check the values of existing data with unknown keys in a Firebase rule?如何在 Firebase 规则中检查具有未知键的现有数据的值?
【发布时间】:2014-09-09 07:57:33
【问题描述】:

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

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

当一个新的动作被提交时,我想参考已经玩过的动作来验证它。对于初学者来说,玩家应该只能下每第二步(玩家一可以从索引0 开始下偶数,玩家二可以下奇数)。

由于每一步的关键是一个未知的随机字符串(根据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 或类似的解决方案,但现在我想知道如何实现这些以及其他如此简单的规则。

【问题讨论】:

    标签: firebase firebase-security


    【解决方案1】:

    并非每个用例都适合用于管理通用列表的单一推荐方法。当然不是你的。您可能会发现an incremental ID 方法更有用。

    由于您无法对子记录键/值执行包含操作,因此您将保留一个可以递增的值。例如,利用上面的增量 ID 方法,我可以编写一个安全规则来确保我正在写入奇数键(并且仅在轮到我的时候),如下所示:

    ".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()"
    

    【讨论】:

    • 感谢您的帮助!实际上,我最终解决了我的问题,只需选择动作的 id(move-0move-1move-2...),因为假设玩家将拥有游戏的完整动作列表是合理的不需要柜台。现在一切正常。
    【解决方案2】:

    只要您不撤消移动(例如从 Firebase 中的列表中删除移动),将其存储为数组 (imo) 就没有任何问题。

    如果您从数组中删除一个元素,就会出现问题,因为索引中的一个数字将被跳过,Firebase 不再将其视为一个数组,而是一个带有数字作为键的对象。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多