【问题标题】:Firebase Security Rules Private User DataFirebase 安全规则私人用户数据
【发布时间】: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 并且不允许访问。但是,如果我允许访问用户,那么由于级联,那么任何人都可以访问其他任何人的数据。

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

我尝试查看其他人的问题,但无法解决。

更新 - 一些照片

【问题讨论】:

  • 您查询的位置似乎没问题。您不是在尝试过滤数据,因此与您提到的“规则不是过滤器”不同。但是&lt;facebookUID&gt; 是从哪里来的呢?你确定在你附加监听器的时候已经初始化了吗?
  • 感谢您的帮助。听众是指 .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


【解决方案1】:

我认为您可能误解了 Firebase 的工作原理。当您调用 on() 时不会返回任何数据。相反,它开始侦听数据并在该数据可用时调用您,然后它会更改。所以需要在回调中处理数据:

firebase.database().ref("users/" + <facebookUID>).on("value",function(snapshot) {
    console.log(snapshot.val());
});

这意味着您不能以通常的“首先获取用户信息,然后对用户信息执行 xyz”方式编写代码。相反,您应该将代码框定为“开始同步用户信息,然后当用户信息可用时对其执行 xyz”。

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

【讨论】:

    【解决方案2】:

    我认为您可能需要更远的规则,即不那么嵌套。您需要定义一个规则以允许 r/w 否则它将失败。我希望我能理解你的问题...?

    【讨论】:

    • 我试试这个让你知道
    【解决方案3】:

    您还可以通过在他或她的用户信息分支下存储用户也可以访问的分支路径列表来对 javascript 端进行限制。这也将把用户从他无权使用或编辑的所有其他东西中封装起来。我不知道它会如何在 javascript 中完成,但我已经在 android 中完成了。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 2016-09-16
      • 2016-12-19
      • 2023-02-13
      • 1970-01-01
      • 2018-09-03
      • 2020-01-15
      • 2019-01-07
      • 2021-06-10
      相关资源
      最近更新 更多