无法使用规则写入Firebase数据库

时间:2017-04-07 02:07:51

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

我试图创建一个允许某些用户写但不是全部的规则。

我需要所有用户都可以阅读菜单'项目,但只有商店数据中列出的用户才能写入。

我的数据结构:

{
    "category" : [ null, "Burger", "Drinks" ],
    "menu" : [ null, {
        "available" : true,
        "category" : "1",
        "description" : "item1 description",
        "image" : "chicken_maharaja",
        "name" : "New Chicken Maharaja",
        "price" : 1300,
        "store" : 1
    }, {
                   "available" : true,
                   "category" : "1",
                   "description" : "item2 description",
                   "image" : "big_spicy_chicken_wrap",
                   "name" : "Big Spicy Chicken Wrap",
                   "price" : 120,
                   "store" : 1
               }, {
                   "available" : true,
                   "category" : "2",
                   "description" : "item3 description",
                   "image" : "thumsup",
                   "name" : "Thumsup 100ml",
                   "price" : 40,
                   "store" : 1
               }, {
                   "available" : true,
                   "category" : "2",
                   "description" : "item4 description",
                   "image" : "mccafe_ice_coffee",
                   "name" : "Ice Coffee",
                   "price" : 140,
                   "store" : 1
               }, {
                   "available" : true,
                   "category" : "1",
                   "description" : "item5 description",
                   "image" : "mc_chicken",
                   "name" : "MC Chicken",
                   "price" : 190,
                   "store" : 1
               }, {
                   "available" : true,
                   "category" : "2",
                   "description" : "item6 description",
                   "image" : "Smoothie",
                   "name" : "Smoothie",
                   "price" : 70,
                   "store" : 2
               }, {
                   "available" : true,
                   "category" : "1",
                   "description" : "item8 description",
                   "image" : "salad_wrap",
                   "name" : "Salad Wrap",
                   "price" : 150,
                   "store" : 2
               } ],
    "stores" : [ null, {
        "location" : "Campinas - Taquaral",
        "name" : "Store 1",
        "user" : {
            "pyixsRTw9qdiuESt62YnmEYXQt13" : true
        }
    }, {
                     "location" : "São Paulo - Perdises",
                     "name" : "Store 2",
                     "user" : {
                         "LBNZ8Dwp2rdJtlSh0NC1ApdtbAl2" : true,
                         "TLomOgrd3gbjDdpDAqGiwl0lBhn2" : true
                     }
                 } ],
    "userProfile" : {
        "LBNZ8Dwp2rdJtlSh0NC1ApdtbAl2" : {
            "birthDate" : "1974-02-10",
            "email" : "asd@asd.com",
            "firstName" : "João",
            "lastName" : "Silva"
        },
        "pyixsRTw9qdiuESt62YnmEYXQt13" : {
            "birthDate" : "1974-02-10",
            "email" : "leandro.garcias@gmail.com",
            "firstName" : "Leandro",
            "lastName" : "Garcia"
        }
    }
}

我的规则:

{
"rules": {
    "menu": {
        "$items": {
            ".read":  "true",
            ".write": "root.child('stores').child('1').child(data.child('user').val()).hasChild(auth.uid)"
        }
    },
    "stores": {
        "$store": {
            ".read":  "true",
            ".write": "root.child('stores').child('$store').child(data.child('user').val()).hasChild(auth.uid)"
        }
    }
}
}

阅读没问题。 :-)但我不能写。

1 个答案:

答案 0 :(得分:0)

您的newData没有孩子user,因此检查总是失败。你可能意味着:

"43268522": {
  "menu": {
    "$items": {
        ".read":  "true",
        ".write": "root.child('stores').child('1').child('user').hasChild(auth.uid)"
    }
  }

您可能正在寻找此规则:

".write": "
  root.child('stores')      
      .child(newData.child('store').val())
      .child('user')
      .hasChild(auth.uid)"

因此,如果当前用户位于他们尝试修改的商店中,则使用新数据中的store属性进行查找。

不幸的是,此规则不适用于您当前的数据结构,因为store的值是一个数字,而商店的键是一个字符串:"1" !== 1

最简单的解决方案是将商店存储为字符串,例如:

"store": "1"

无论如何,您可能想要考虑这一点,因为您现在正在获取Firebase的阵列强制,这没有用。有关详情,请参阅Best Practices: Arrays in Firebase上的博文。我建议使用push IDs存储商店,或者只是为它们添加前缀,例如

"stores": {
  "store1": {
    ...
  }
}