【问题标题】:Firebase Rules how to prevent add or update value if its parent is deletedFirebase 规则如何在其父级被删除时防止添加或更新值
【发布时间】:2018-02-21 22:52:07
【问题描述】:

我在问我是否有这个 firebase 数据库

Misters
 + 7m1fyYchDscr8tUeI13uPXvdDvM2
 + gvTVc3gwRfTz3WL48vTGiiiTKZ22
 - vWZ55LGiraaIErIiiVN4NVQc6Eh1
     active_type:true
     age: 27

如果其父节点已删除,如何防止添加新节点或更新现有节点 (vWZ55LGiraaIErIiiiVN4NVQc6Eh1)?

例如,我有阻止更新的规则

{
    "rules": {
        ".read": true,
        ".write": "auth != null",
        "Misters": {
            "$Misterid": {
                "active_type:true": {

                    ".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
                }
            }
        }
    }

但如果找不到父级,我想阻止

【问题讨论】:

  • 您的意思是防止Misters下的新孩子添加和更新的规则吗?

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


【解决方案1】:
  1. 将所有添加的$Misterid 存储在一个名为MistersAdded 的新节点中。这可以通过使用云功能自动完成
  2. 在下面添加规则

这包括一个exists() 方法,该方法将检查MistersAdded 地图以查看它是否曾经被创建。如果您希望能够让用户删除地图,请添加 '|| data.val() == null' 在写规则后面。

{
    "rules": {
        ".read": true,
        ".write": "auth != null",
        "Misters": {
            "$Misterid": {
                "active_type:true": {
                    ".write": !root.child('MistersAdded').child($Misterid).exists()
                    ".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
                }
            }
        }
    }

【讨论】:

    【解决方案2】:

    如果我理解正确,基本上会发生的是,您的写入操作将重新创建已删除的“vWZ55LGiraaIErIiiVN4NVQc6Eh1”。

    所以我会这样做:

    {
        "rules": {
            ".read": true,
        ".write": "auth != null",
        "Misters": {
            ".write" : "root.child('Misters').hasChild(<Misterid>)"
            "$Misterid": {
                "active_type:true": {
    
                    ".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
                }
            }
        }
    }
    

    【讨论】:

    • 我会尝试并告诉你结果
    【解决方案3】:

    你真的想在“规则”中这样做吗?这意味着您在应用逻辑时不能有选择性。我建议以编程方式进行。

     DatabaseReference mDatabase = FirebaseDatabase.getInstance();
        rootRef = mDatabase.child("vWZ55LGiraaIErIiiVN4NVQc6Eh1");
        addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          void onDataChange(DataSnapshot snapshot) {
            if (snapshot.exists()) {
              // run some code here if node exists
            } else { 
                // run some code here if node does not exist
            }
          }
        });
    

    我希望这会有所帮助。这样做意味着您可以做的不仅仅是验证,甚至可以通知您的用户并执行 UI 操作。

    【讨论】: