Firebase Realtime数据库安全规则-检查其他节点

时间:2019-08-10 10:35:00

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

我希望保护数据安全,同时允许用户在Firebase Realtime数据库中获取属于他们可以访问的“类别”的“笔记”。我想避免重复和维护访问条目-因此访问仅存储在类别中。只有该类别的作者才能访问该类别中的“注释”。

数据库结构:

"categories" : {
  "category_001": {
    "access": {
      "author": "user-001"
    }
    "data" : {
      "title": "My first category"
    }
  }
}
"notes" : {
  "note_001": {
    "data" : {
      "note": "Hello world!",
      "categoryId": "category_001"
    }
  }
}

Firebase规则:

{
  "rules": {
    "notes": {
      ".read": "
        auth.uid !== null &&
        query.equalTo === auth.uid
      ",
      "data": {
        ".read": "
        root.child('categories').child('access').child('author').val() === auth.uid"
      }
    }
}

错误的数据库查询(不检查类别中的访问权限):

database.ref("notes")
  .orderByChild("access/author")
  .equalTo(`${user.uid}`)
  .once('value', (snapshot) => {
    snapshot.forEach( (data) => {
      console.log("OWNER", data.val().data.title)
    })
})

我如何编写数据库查询来检查“ categories / category001”节点的访问权限-同时读取“ notes” / note001“节点”?

亲切的问候/ K

1 个答案:

答案 0 :(得分:1)

由于您无法编写正确的查询,因此无法使用这种类型的规则。

您当前的查询:

database.ref("notes")
  .orderByChild("access/author")
  .equalTo(`${user.uid}`)

这正试图读取每个便笺的access/author属性,但该属性不存在。 Firebase在这里不会为您执行联接,因此查询将不得不处理notes子级中的信息。