根据Firebase中的规则检索数据

时间:2018-09-01 10:11:35

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

我正在尝试根据登录用户从Firebase中的实时数据库检索数据。

我在Firebase中的节点如下所示:https://prnt.sc/kpdoq9 我的规则是这样设置的:

{
  "rules": {
    "userhours": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }   
    }
  }
}

当我尝试通过我的方法检索数据时:

  loadUserHours() {
      firebase
        .database()
        .ref("userhours")
        .once("value")
        .then((data) => {
            const obj = data.val();
            console.log(obj)
            })
        },

我得到一个Error: permission_denied at /userhours

我认为这与规则有关

".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"

因为“主内部节点”不是实际的uid(已登录用户ID),而是由Firebase生成的随机密钥?我的结构应该是什么样的?

我假设当将Firebase节点设置为userhours/{uidhere}/..时,规则正在路径userhours/{randomKeyGeneratedByFirebase}/..中寻找一个uid

1 个答案:

答案 0 :(得分:0)

Firebase数据库安全规则不会为您过滤数据。相反,它仅在附加数据时检查是否允许侦听器访问数据。

当用户将侦听器附加到/userhours时,Firebase数据库服务器将检查他们是否对该节点具有读取权限。由于您仅授予/userhours/$uid的读取权限,因此没有人拥有/userhours的读取权限,并且读取被拒绝。

您将需要将侦听器附加到/userhours/$uid。所以:

firebase
  .database()
  .ref("userhours")
  .child(firebase.auth().currentUser.uid)
  .once("value")
  .then((data) => {
      const obj = data.val();
      console.log(obj)
  })