我想检索用户生成的数据,但是在Firebase中出现权限被拒绝的错误

时间:2018-09-03 14:17:58

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

为dummyOrders编写的规则:

"rules": {
    "dummyOrders":{
      "$dummyid":{
        ".write": "auth!=null && $dummyid.contains(auth.uid)",
        ".read": "auth!=null && $dummyid.contains(auth.uid)"
      }
    }

虚拟订单的结构:

-LLKkP5GLMkMqy-OvFsY|3wvZGffGY5gUSKlFzhLw7hwXLEi1
    cemail: "nateshmbhat1@gmail.com"
    cid: "NKGiiChIqCdUcithC48mtuWkaAt1"
    cname: "Natesh Bhat"
    date: "2018-09-01T15:31:25.060Z"
    file_names: "JavaEvaluation.doc,"
    message: "Sample testing. "
    oid: "Order 230"
    status: "requested"
    xid: "ybfXhEkmCNbOuAN0XJYE8b84ix93"
    xshopName: "SIT Campus Xerox"

当我在Firebase中运行模拟器时,它没有给出任何错误。

我正在尝试从dummyOrders和我上面编写的规则中检索数据。

我正在尝试使用以下代码访问数据:

var orderRef = firebase.database().ref('dummyOrders').orderByChild('cid').equalTo(user.uid);

我收到Firebase权限被拒绝的错误。我是Firebase的新手,因此我需要一些帮助来了解如何检索要尝试访问的数据。

虚拟订单ID为:

  

-LLKkP5GLMkMqy-OvFsY | 3wvZGffGY5gUSKlFzhLw7hwXLEi1

数据来自3wvZGffGY5gUSKlFzhLw7hwXLEi1的UID,我需要在他的个人资料中显示该数据。

-LLKkP5GLMkMqy-OvFsY是我也需要向其显示此订单的某些商店的商品。

因此,对于dummyOrder,我将其ID指定为

  

shopid | userid

请让我知道我在这里犯的错误。我不明白为什么会收到拒绝权限错误以及如何解决该错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先要注意的是Firebase rules are not filters。因此,当您尝试从firebase.database().ref('dummyOrders')获取数据时,它将检查用户是否在该位置具有权限。由于您没有该位置的规则,因此Firebase将使用默认值false

有两个可能的解决方案。首先是确保您从规则中指定的位置(在本例中为firebase.database().ref('dummyOrders').child($dummyid))中进行读取/写入。但是由于您使用的是复合键,并且您可能只知道用户ID,所以我怀疑这将是适合您的解决方案。

第二个选项是使用Query-based security rules。使用此选项,您可以指定允许的查询。对于问题中的代码,您将获得如下所示的规则。

"rules": {
  "dummyOrders":{
    ".read": "query.orderByChild == 'cid' &&
        query.equalTo == auth.uid" // restrict basket access to owner of dummyOrders

    "$dummyid":{
      ".write": "auth!=null && $dummyid.contains(auth.uid)",
      ".read": "auth!=null && $dummyid.contains(auth.uid)"
    }
  }
}

请记住,要使基于查询的规则起作用,查询必须与规则匹配。