2016-05-12 49 views
0

我想读取所有用户名用户父节点,因为我在我的应用程序中使用搜索功能(如果提供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" 
    }, 
+0

@Arescet我知道什么意思是soflow,这是Firebase安全脚本,我上面解释了我在使用时遇到的情况。不要建议关于不相关的主题。 – tobeiosdev

回答

1

首先,为什么你仍然可以访问电子邮件的原因是因为当你设置读真正的父节点rules cascade意义所有的孩子也可以读。在你的情况下:

"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安全性的文档。它可以真正帮助你避免这种情况,并且可能会给你一些关于为你的案例实施一个好的安全的想法。

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

相关问题