多路径更新期间Firebase安全规则失败

时间:2018-03-13 11:06:39

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

在firebase中,我设置安全规则以保护某些节点。

问题

当我使用多路径更新同时更新多个路径时,如果一个安全规则对于任何多个路径都失败,那么整个更新将失败。

我的问题示例

假设我在我的实时数据库中有3个节点(用户,人员,任务),在android中一起更新3条路径的方法是做这样的事情:

     Map multi-update =new HashMap();

    multi-update.put("users/user1/name","any_name");
    multi-update.put("people/user2/status", "any_status");
    multi-update.put("tasks/task1/details", "any_details");

    DatabaseReference root=FirebaseDatabase.getInstance().getReference();

    //update
     root.updateChildren(multi-update);

让我说我的规则是这样的:

    "users":{
       ".write":"true"
     }

    ,"people":{
        ".write":"true"
      }
    ,"tasks":{
        ".write":"false"
        } 

由于任务不允许写入,因此多路径更新永远不会更新,直到所有路径都允许写入。

有人能解释为什么会这样吗?

感谢。

1 个答案:

答案 0 :(得分:2)

根据the firebase docs

  

以这种方式进行的同步更新是原子的:要么全部更新   成功或所有更新都失败。

因此,您所描述的问题实际上并不是问题,而是root.updateChildren(multi-update);的预期行为

如果您的情况出现此问题,则可以更改firebase规则以授予多次更新的所有部分的权限,或者将多次更新分成几部分,以确保可以成功的部分成功。

您的另一个选择是检查这样的错误:

root.updateChildren(multi-update, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError firebaseError, DatabaseReference firebase) {
        if (firebaseError != null)
        {
            //Update the minimum required fields
        }
    }
});

这方面的缺点是你不知道更新的哪一部分失败了。