如何防止在同一父节点中检索子节点?

How prevent retrieve a child in same parent node?

我想从用户父节点读取所有用户名,因为我在我的应用程序中使用搜索功能(如果提供了searchActive :用户节点中的真实子节点)。但是 电子邮件需要只有所有者才能访问。

我刚刚试过如下所示,但我仍然收到电子邮件。我不仅担心电子邮件的安全问题,还担心我丢失了什么以及如何整理所有这些信息?

"rules": {
    "users": {
      ".read": "auth !== null",
      "$uid": {
         ".write": "auth !== null && auth.uid === $uid",
         ".read": "auth !== null && auth.uid === $uid",
          "username": {
             ".validate": "
              !root.child('usernames').child(newData.val()).exists() ||
               root.child('usernames').child(newData.val()).val() == $uid"
               },
          "email": {
              ".read": "auth.uid == 'facebook:'+$uid || auth.uid == $uid"
               }
         }
    },
    "usernames": {
          ".write": "auth !== null",
          ".read": "auth !== null"
    },

首先,您仍然可以访问电子邮件的原因是 rules cascade 这意味着当您将父节点的 read 设置为 true 时,所有子节点也可以被读取。你的情况:

"users": {
  //Read is being set to true here for everything in this node
  ".read": "auth !== null",
  "$uid": {
     ".write": "auth !== null && auth.uid === $uid",
     //This will be ignored, since read was allowed already
     ".read": "auth !== null && auth.uid === $uid",
      "username": {
         ".validate": "
          !root.child('usernames').child(newData.val()).exists() ||
           root.child('usernames').child(newData.val()).val() == $uid"
           },
      "email": {
          //This will be ignored, since read was allowed already
          ".read": "auth.uid == 'facebook:'+$uid || auth.uid == $uid"
           }
     }
},
"usernames": {
      ".write": "auth !== null",
      ".read": "auth !== null"
},

我建议您花一些时间阅读所有关于 firebase 安全性的文档。它确实可以帮助您避免这种情况,并且可能会给您一些关于为您的案例实施良好安全性的想法。

一种可能的解决方案是使用单独的用户名节点,您可以在其中存储搜索功能的所有用户名。您可以使用规则来确保每个人都可以阅读它,但只有特定用户名的所有者才能更改它。