【发布时间】:2017-06-24 09:13:28
【问题描述】:
我正在尝试文档 (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
});
在模拟器中,如果我查询节点,它会起作用:“users/”+ facebookUID
但是当我运行代码时,什么都没有返回。
所以我猜它与安全规则有关,不能是过滤器或其他东西....因为我没有访问/用户的规则,对其节点的访问返回 false 并且不允许访问。但是,如果我允许访问用户,那么由于级联,那么任何人都可以访问其他任何人的数据。
那么我该如何解决这个问题?
我尝试查看其他人的问题,但无法解决。
更新 - 一些照片
【问题讨论】:
-
您查询的位置似乎没问题。您不是在尝试过滤数据,因此与您提到的“规则不是过滤器”不同。但是
<facebookUID>是从哪里来的呢?你确定在你附加监听器的时候已经初始化了吗? -
感谢您的帮助。听众是指 .on 通话吗?这应该没问题,因为当 .read 和 .write 在 root 上设置为 true 时,代码可以正常工作并且我可以访问。我会在我的原始帖子中添加一些照片
-
@FrankvanPuffelen 任何机会你都可以分叉这个github.com/rhroyston/firebase-auth 并在 .js 文件的底部添加一个“管理员批准”方法(它真的会帮助我,我认为其他人?)你'重新做人。 ...顺便说一句,这是我知道与您联系的唯一方式。希望你不要介意。像approveUser(uid,'gold')/approveUser(uid,'bronze')。多级管理员?
-
我找到了解决方案,这首先是我的错误:我认为如果用户使用 Facebook 登录,安全规则中的 auth.uid 值将是 facebook id,但不是facebook id 与登录时 firebase 返回对象中的 auth.id 不同。
标签: javascript firebase firebase-realtime-database firebase-security