Firebase 使用 newData 进行验证

Firebase validate with newData

我正在研究 Kato 在这个 post 中展示的关于如何构建数据的优秀示例: Firebase user account security with firebaseSimpleLogin

我没有运气得到验证以正常工作。

数据结构为:

accepted_invites
    game1
       desc  "fun game"

 invites
     game1
       uuidAAA    true
       uuidBBB    true

这是一个屏幕截图: Firebase data

如果我尝试编写以下内容

   ref.child("accepted_invites").child("game1").child("userTwo").child("uuidBBB").setValue(true);

它将使用此规则在 accepted_invites 中创建条目:

".validate": "root.child('invites/'+$game_id+'/uuidBBB').exists()"

但不是

".validate": "root.child('invites/'+$game_id+'/'+newData.val()).exists()"

我尝试使用模拟器,但我越来越 类型错误:+ 仅对数字和字符串进行运算。

这是我所拥有的完整规则:

{
  "rules": {   
    ".write" : true,
    ".read" : true,
  "accepted_invites": {
    "$game_id": {
      "$user_id": {
        //This validate rule fails  
        //".validate": "root.child('invites/'+$game_id+'/'+newData.val()).exists()"
        //This one works
        ".validate": "root.child('invites/'+$game_id+'/uuidBBB').exists()"
      }
    }
  }
}
}

newData 关键字是引用所有传入数据的特殊属性,但在 path 表达式中不允许使用它,因为它可能不是字符串。即,它很可能是一个对象。

如果您有兴趣在路径中使用该数据的某些部分,我建议您只在更深的路径中包含另一个验证规则,例如:

{
  "rules": {   
    ".write" : true,
    ".read" : true,
    "accepted_invites": {
      "$game_id": {
        "$accepting_user_id": {
          "$sending_user_id": {
            ".validate": "root.child('invites').child($game_id).child($sending_user_id).exists()"
          }
        }
      }
    }
  }
}