所以我建立了一个简单的 db/web 表单来收集一些用户数据。Rn 我试图弄清楚规则的事情,但我遇到了这个问题 - 如果我的read
标志设置为true
那么我可以简单地在控制台中运行它
var ref = firebase.database().ref();
ref.on("value", function(snapshot) {
console.log(snapshot.val());
}, function (error) {
console.log("Error: " + error.code);
});
并暴露用户这不应该是可能性。如果我设置read
为,false
则无法预先访问数据库以验证电子邮件地址是否唯一。我想我需要实现两件事:
ps 我的当前规则(防止删除,防止读取,确保 POST 请求具有某些字段):
{
"rules": {
"users": {
".read": false,
"$uid": {
".write": "!data.exists()",
".validate": "newData.hasChildren(['first_name', 'last_name', 'email', 'country', 'amount'])"
}
}
}
}
为避免重复,您需要在数据库中进行验证检查,而不是从客户端读取数据并进行检查(您不能信任客户端)。
由于没有简单的方法可以检查 firebase 基础集合中的重复子值,因此您需要一个单独的集合来跟踪电子邮件,然后根据该集合验证您的电子邮件,即:
{
"rules": {
"users": {
".read": false,
"$uid": {
".write": "!data.exists()",
".validate": "newData.hasChildren(['first_name', 'last_name', 'email', 'country', 'amount'])",
"email": {
".validate": "!root.child('emails').child(newData.val()).exists()"
}
}
},
"emails": {
".read": false,
".write": "!data.exists()"
}
}
}
然后,您需要在添加用户时将用户的电子邮件写入电子邮件集合,例如:
var ref = firebase.database().ref('emails/'+email);
ref.set(uid)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句