Firebase读取权限

Firebase读取权限,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,因此,我设置了一个简单的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.cod

因此,我设置了一个简单的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,则我无法预先访问DB以验证电子邮件地址是否唯一。我想我需要实现两件事:

防止数据库窥探运行任何代码段的开发工具 确保电子邮件地址是唯一的。 p、 s.我当前的规则阻止删除、阻止读取,确保POST请求具有特定字段:

{
  "rules": {
    "users": {
        ".read": false,
        "$uid": {
         ".write": "!data.exists()",
         ".validate": "newData.hasChildren(['first_name', 'last_name', 'email', 'country', 'amount'])"
       }
    }
  }
}

为了避免重复,您需要在DB中进行验证检查,而不是从客户机读取数据并检查您不能信任客户机

由于没有简单的方法来检查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)