如何防止在同一父节点中检索子节点?
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 安全性的文档。它确实可以帮助您避免这种情况,并且可能会给您一些关于为您的案例实施良好安全性的想法。
一种可能的解决方案是使用单独的用户名节点,您可以在其中存储搜索功能的所有用户名。您可以使用规则来确保每个人都可以阅读它,但只有特定用户名的所有者才能更改它。
我想从用户父节点读取所有用户名,因为我在我的应用程序中使用搜索功能(如果提供了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 安全性的文档。它确实可以帮助您避免这种情况,并且可能会给您一些关于为您的案例实施良好安全性的想法。
一种可能的解决方案是使用单独的用户名节点,您可以在其中存储搜索功能的所有用户名。您可以使用规则来确保每个人都可以阅读它,但只有特定用户名的所有者才能更改它。