【问题标题】:do not get response data with firebase database rules不使用 firebase 数据库规则获取响应数据
【发布时间】:2019-12-04 15:07:38
【问题描述】:

为我的报价表添加规则后,我没有从 firebase 实时数据库中获得任何回报。我希望在 auth.uid 与报价的所有者值匹配的情况下返回所有报价。但是我什么也没得到。

谁能帮帮我?

规则指定为:

{
  "rules": {
    "users":{
        ".read": "auth.uid != null",
        ".write": "auth.uid != null"     
    },
    "quotes":{
      "$uid":{
        ".read": "data.child('owner').val() === auth.uid",
      }
    }
  }
}

报价表的结构如下:

{
  "1ec658d2-a7cb-45b8-8d9b-9c2a6783365d" : {
    "dateCreated" : "2019-12-02T16:06:50+01:00",
    "owner" : "DVRVSpeOXQV6wAmHAdpAe6iPQ5i2",
    "ownerName" : "testOost",
    "projectName" : "testProject1"
  },
  "96549b51-6356-4c37-a388-592561394d1a" : {
    "dateCreated" : "2019-09-25T14:58:13+02:00",
    "owner" : "xZBFCq4ho3V2G8dZTvK7RjsnTr43",
    "ownerName" : "timcastelijn",
    "projectName" : "testProject2"
  }
}

我访问数据的代码是

this.props.firebase.db.ref('quotes/').on('value', snapshot => {
  const quotesObject = snapshot.val();

  /* quotesObject is handled here */

});

更新:已解决

@frank-van-puffelen 的解决方案解决了这个问题。

新规则:

{
  "rules": {
    "users":{
        ".read": "auth.uid != null",
        ".write": "auth.uid != null"     
    },
    "quotes":{
      ".read": "auth.uid != null &&
                query.orderByChild == 'owner' &&
                query.equalTo == auth.uid" // restrict basket access to owner of quote
      }
    }
  }
}

新的sn-p:

this.props.firebase.db.ref('quotes/').orderByChild("owner")
             .equalTo(this.authUser.uid)
             .on("value", snapshot => {

  const quotesObject = snapshot.val();

  ....

});

}

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    您的代码尝试从/quotes 读取,但您的规则不允许任何人读取/quotes。所以规则拒绝读取操作。

    记住:

    • 规则不过滤数据,而只是强制执行访问规则。
    • 如果您只想允许用户读取他们自己的数据,则您的代码和规则需要协同工作才能实现。

    在您当前的用例中,您可以简单地修改代码以仅读取该特定用户的节点:

    var uid = firebase.auth().currentUser.uid;
    this.props.firebase.db.ref('quotes/'+uid).on('value', snapshot => {
      const quotesObject = snapshot.val();
    
      /* quotesObject is handled here */
    
    });
    

    在其他情况下,您需要在代码中使用查询,然后在规则中验证该查询。

    有关这些的更多信息,请参阅:

    【讨论】:

    • 嗨@frank-van-puffelen,感谢您的回复。我得到了它与您对查询的建议。然而,我意识到我实际上是在尝试创建一个过滤器,向其所有者显示数据,同时也向具有 ADMIN 角色的用户显示数据。你有什么建议可以实现吗?
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多