Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase安全规则专用用户数据_Javascript_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Javascript Firebase安全规则专用用户数据

Javascript Firebase安全规则专用用户数据,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我正在尝试文档()中的这些安全规则: 我希望用户能够在“用户”下对其节点进行读写操作,其他任何人都无法访问他们的信息 我的数据结构如下: 在用户下,我将用户信息存储在他们的Facebook UID下 myfirebase users -<facebookUID> ->user info stored here -<facebookUID> ->user info stored here -<facebookUID> ->user info s

我正在尝试文档()中的这些安全规则:

我希望用户能够在“用户”下对其节点进行读写操作,其他任何人都无法访问他们的信息

我的数据结构如下: 在用户下,我将用户信息存储在他们的Facebook UID下

myfirebase
users
-<facebookUID>
->user info stored here
-<facebookUID>
->user info stored here
-<facebookUID>
->user info stored here
myfirebase
使用者
-
->用户信息存储在这里
-
->用户信息存储在这里
-
->用户信息存储在这里
在我的代码中,我通过以下方式查询数据库:

var userinformation = firebase.database().ref("users/" + <facebookUID>).on("value",function(snapshot) {

//...do stuff here

});
var userinformation=firebase.database().ref(“users/”+).on(“value”,函数(快照){
//…在这里做事
});
在模拟器中,如果我查询节点:“users/”+facebookUID,它就会工作

但当我运行代码时,什么都不会返回

所以我猜这与安全规则有关,不能是一个过滤器或其他东西……因为我没有访问/用户的规则,对他们节点的访问返回false,不允许访问。但如果我允许访问用户,那么由于级联,任何人都可以访问其他任何人的数据

那么我该如何解决这个问题呢

我试着看别人的问题,但没能解决

更新-一些照片


我想你可能误解了Firebase的工作原理。在()上调用
is时,
is不会返回任何数据。相反,它开始监听数据,并在数据可用时呼叫您,然后更改。因此,您需要处理回调中的数据:

firebase.database().ref("users/" + <facebookUID>).on("value",function(snapshot) {
    console.log(snapshot.val());
});
firebase.database().ref(“用户/”+).on(“值”,函数(快照){
console.log(snapshot.val());
});
这意味着您不能以通常的“先获取用户信息,然后使用用户信息执行xyz”方式编写代码。相反,您应该将代码框定为“开始同步用户信息,然后在用户信息可用时对其执行xyz”


在上面的代码段中,“xyz”正在记录信息,但您也可以轻松地更新UI。重要的是,执行“xyz”的代码必须在回调中,因为这是唯一可以获得用户信息(并且是最新的)的地方。

我认为您可能需要一个更深入的规则,即不要嵌套。您需要定义一个规则来允许r/w,否则它将失败。我希望我理解了您的问题…?

您也可以通过在用户信息分支下存储用户也可以访问的分支路径列表来对javascript进行限制。这还将封装用户,使其不受其他任何他无权使用或编辑的内容的影响。我不知道如何在javascript中实现,但我已经在android中实现了。希望这能有所帮助。

您查询的位置看起来不错。您并没有试图过滤数据,所以不像您提到的“规则不是过滤器”。但是
来自哪里?您确定在连接侦听器时它已初始化吗?谢谢您的帮助。你说的听众是指随叫随到的人吗?这应该没问题,因为当root上的.read和.write设置为true时,代码工作正常,我有访问权限。我会把一些照片加到我的原稿上post@FrankvanPuffelen有没有可能你可以把这个叉出来,在.js文件的底部添加一个“管理员批准”方法(这对我和其他人都有帮助?)你就是那个人。。。顺便说一句,这是我知道的唯一联系你的方法。希望你不介意。类似于approveUser(uid,'gold')/approveUser(uid,'brown')。一个多级管理员?我首先找到了一个解决方案,这是我的错误:我认为如果用户使用Facebook登录,安全规则中的auth.uid值将是Facebook id,但Facebook id与登录时firebase返回对象中的auth.id不同。我会尝试一下,让您知道
firebase.database().ref("users/" + <facebookUID>).on("value",function(snapshot) {
    console.log(snapshot.val());
});