首页 > 解决方案 > 我想检索用户生成的数据,但在 Firebase 中获得权限被拒绝错误

问题描述

为 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 新手,因此我需要一些帮助来了解如何检索我试图访问的数据。

dummyorder id 是:

-LLKkP5GLMkMqy-OvFsY|3wvZGffGY5gUSKlFzhLw7hwXLEi1

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

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

所以对于 dummyOrder 我给了 id 作为

店铺标识|用户标识

请让我知道我在这里做的错误是什么。我无法理解为什么我会收到权限被拒绝错误以及如何解决它。

谢谢你的帮助。

标签: firebasefirebase-realtime-databasefirebase-authenticationfirebase-security

解决方案


首先要注意的是Firebase 规则不是过滤器。因此,当您尝试从中获取数据时firebase.database().ref('dummyOrders'),将检查用户是否在该位置具有权限。因为您没有该位置的规则,所以 Firebase 将使用默认值,即false.

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

第二个选项是使用基于查询的安全规则。有了它,您可以指定允许的查询。对于问题中的代码,您将获得如下所示的规则。

"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)"
    }
  }
}

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


推荐阅读