【问题标题】:Firebase rules setValue only if a child existFirebase 规则 setValue 仅在孩子存在时
【发布时间】:2019-08-21 05:46:03
【问题描述】:

我正在尝试使用规则,但它不起作用。

结构如下:

我有这个命令:DeleteItemFromListRef.child("List").child(obj.getsEventID()).child(ID).child("check").setValue(false);

但我只想在子项(键)存在的情况下将值设置为“false”,这样如果项目被删除,我就不会简单地拥有它:

这是我的规则:

 "List": {
    "$listID" : {
      "$key": {
        "check" : {
      ".write":"data.child('List').child($listID).child($key).child('key').exists()"
    }
  }
}

}

但是,如果子键为空,它仍然会像这样上传数据:

如果有人能帮忙,那就太好了

编辑 2:这里有更简单的规则

"rules": {






           "List": {
            "$listID" : {
               "$key": {
                 "check" : {  
".read":"auth.uid != null", 
".write":"auth.uid != null", 
".validate":"data.parent().child('key').exists()"

}
}}}}}

+评论:

因此,如果我添加新地图,我总是使用地图更新项目,但如果我只更改子项 "check" 我使用 "setValue" 方法并且希望仅当项目已经存在时才完成 setValue (== child key already exist)

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-security


    【解决方案1】:

    如果你只想允许写入checked,如果它的兄弟属性key存在,你可以这样做:

    "List": {
        "$listID" : {
            "$key": {
                "check" : {
                    ".validate":"data.parent().child('key').exists()"
                }
            }
        }
    }
    

    更新由于您无法完成这项工作,我只是在一个非常简单的设置中对其进行了测试。在我的数据库中的 /55431756 下,我有这个 JSON:

    {
      "has_key" : {
        "key" : "value"
      }
    }
    

    所以它是一个键 has_key 有一个 key。现在我运行了两个模拟:一个尝试写信给has_key

    写入has_key 成功,因为has_key/key 存在:

    写入no_key 被拒绝,因为没有no_key/key 孩子:

    【讨论】:

    • 它不起作用,当我将值设置为 false 并且该项目不存在时,我仍然得到这个 i.stack.imgur.com/PIcRQ.png...我用我的所有规则编辑了问题
    • 权限向下级联。一旦您在树中的某个级别授予权限,您就无法在较低级别将其删除。因此,原始规则中的 ".write" : "true"".write":"auth.uid != null" 会覆盖较低级别的限制性更强的 .write。但是,.validate 应该始终是 ANDed。你能用更小的 JSON 和规则重现问题,以便我测试它们吗?
    • 你对“ANDed”有什么误解?因此,如果我理解得很好,如果我想为我的所有孩子使用单独的规则,我就不应该在开头使用:“”.read”:“auth.uid != null”,“.write”:“auth .uid != null", " 因为它始终是读写规则,因为它是树中较高的位置?我像你建议的那样编辑了我的规则+ cmets。感谢您的宝贵时间
    • 我刚刚在我自己的数据库上运行了一个测试,并且规则按照我的期望执行。我不确定您的设置中发生了什么,这就是我分享我所做的整个测试的原因。
    • 谢谢先生,现在效果更好了。我更了解它的工作方式,这真的很有帮助。
    【解决方案2】:

    好吧,您也可以先检查孩子是否存在,然后执行上述命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2016-11-16
      • 2017-01-02
      相关资源
      最近更新 更多