时事通讯签约表单的实时数据库规则

我的网站上只有一个字段表单,可以用来注册时事通讯。它询问电子邮件地址并将其提交到Firebase数据库。我不希望除我以外的任何人阅读它,我也不希望任何人能够更新或删除其中的任何内容。

我希望允许公众做的所有事情就是向数据库写入电子邮件地址。

这是我当前的规则:

{
  "rules": {
    "emails": {
       "$uid": {  
         ".write": "!data.exists()",
           "mail" : {
             ".validate": "newData.val().matches(/^.*[@].*[.].*$/)"
           }

       }
     }
   }
}

它接受如下内容:

firebase.database().ref('emails').push().set({mail: "test@gmail.com"});

并否认以下内容:

firebase.database().ref('emails').push().set({mail: "test"});

但仍接受这一点:

firebase.database().ref('emails').push().set({test: "test"});

我如何修复此问题?


解决方案

您将希望use a $ wildcard rule拒绝任何其他内容:

"$uid": {  
  ".write": "!data.exists()",
    "mail" : {
      ".validate": "newData.val().matches(/^.*[@].*[.].*$/)"
    },
    "$other": {
      ".validate": false
    }
}

相关文章