我正在尝试使用文档(https://firebase.google.com/docs/database/security/quickstart#sample-rules)中的这些安全规则:
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
我希望用户能够在用户下读取和写入他们的节点,而其他任何人都无法访问他们的信息。
我的数据结构是这样的: 在用户下,我将用户信息存储在他们的Facebook UID下。
myfirebase
users
-<facebookUID>
->user info stored here
-<facebookUID>
->user info stored here
-<facebookUID>
->user info stored here
在我的代码中,我通过以下方式查询数据库:
var userinformation = firebase.database().ref("users/" + <facebookUID>).on("value",function(snapshot) {
//...do stuff here
});
在模拟器中,如果我查询节点,它可以工作:&#34; users /&#34; + facebookUID
但是当我运行代码时,没有任何东西返回。
所以我猜测它与安全规则有关的东西不能是过滤器或类似东西......就像因为我没有规则来访问/用户对其节点的访问返回false并且不允许访问。但是,如果我允许访问用户,那么由于级联,任何人都可以访问其他任何人的数据。
那么我该如何解决这个问题呢?
我试着查看其他问题,但无法解决。
更新 - 一些照片
答案 0 :(得分:0)
我认为您可能误解了Firebase的工作原理。当您致电on()
时,不会返回任何数据。相反,它开始侦听数据,并在数据可用时调用您,然后更改。所以你需要处理回调中的数据:
firebase.database().ref("users/" + <facebookUID>).on("value",function(snapshot) {
console.log(snapshot.val());
});
这意味着您无法在通常的“首先获取用户信息,然后用用户信息做xyz”时尚中编写代码。相反,你应该将代码框架化为“开始同步用户信息,然后当用户信息可用时,用它做xyz”。
在上面的代码段中,“xyz”正在记录信息,但您可以轻松更新UI。重要的是,执行“xyz”的代码必须在回调中,因为这是用户信息可用(并且是最新的)的唯一位置。
答案 1 :(得分:0)
我认为您可能需要更远的规则,即不是那么嵌套。您需要定义规则以允许r / w或它将失败。我希望我理解你的问题......?
答案 2 :(得分:0)
您还可以通过在用户信息分支下存储用户也可以访问的分支路径列表来对javascript端进行限制。这也会将用户封装在他无权使用或编辑的所有其他内容中。我不知道如何在javascript中完成它,但我已经在android中完成了。希望这有帮助。