我想阅读用户父节点的所有用户名,因为我在我的应用中使用搜索功能(如果在用户节点中提供了searchActive:true child)。但电子邮件只能由所有者访问。
我刚刚尝试过,但我仍然收到电子邮件。我担心安全不仅仅是电子邮件,我缺少什么,我如何组织所有这些?
"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 :(得分:1)
首先,你仍然可以访问电子邮件的原因是因为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安全性的所有文档。它可以真正帮助您避免这种情况,也许会让您对为您的案例实施良好的安全性提出一些想法。
可能的解决方案是使用单独的用户名节点,您可以在其中存储搜索功能的所有用户名。您可以使用规则来确保每个人都可以阅读它,但只有特定用户名的所有者才能更改它。