Firebase规则不允许用户在android中写入数据

时间:2016-08-09 13:00:37

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

这是数据库结构。

enter image description here

这是数据库规则:

{
  "rules": {
    ".read": true,
    "shops-product-list": {
        "$uid": {

        // grants write access to the owner of this user account whose uid must exactly match the key ($uid)
        ".write": "auth !== null && auth.uid === $uid",
        }
    }
  }
}
商店 - 产品列表的

键是登录用户的uid(忽略第一个键,即-1)

记录用户尝试使用此逻辑写入新数据。

private void addShopVariant(String pid, String vid, String mrp, String sellPrice) {
    // Create new post at /user-posts/$userid/$postid and at
    // /posts/$postid simultaneously

    final String uid = getUid();
    String key = pid + "_" + vid;
    //String key = databaseReference.child("shops-product-list").child(uid).push().getKey();

    ShopProductVariant shopProductVariant = new ShopProductVariant(pid, vid, mrp, sellPrice);
    Map<String, Object> shopProductVariantValues = shopProductVariant.toMap();
    Map<String, Object> childUpdates = new HashMap<>();
    childUpdates.put("/shops-product-list/" + uid + "/"+ key, shopProductVariantValues);
    //childUpdates.put("/user-posts/" + userId + "/" + key, postValues);

    databaseReference.updateChildren(childUpdates);
}

如果设置规则,函数可以正常工作。

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

但我希望只有登录用户应该能够写出,这也只是他们自己的数据。

上面的火力规则有什么问题?

1 个答案:

答案 0 :(得分:0)

我认为你的规则是错误的设置:

应该如下:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

请注意它的语法!= not!==

编辑: 而不是在服务器上验证这一点,你可以这样做:

scoresRef.child("the user id").setValue("your value", withCompletionBlock: { (error:NSError?, snapshot:FIRDatabaseReference) in


})

这样你就不必在规则中这样做了