2

我正在构建一个 AngularjS 应用程序,它允许用户(通过 Firebase 匿名身份验证)提交他们的全名、公司和电子邮件地址以进入我们的分发列表。

我想要完成的是禁用用户表单输入数据两次,从而检查提交的数据是否已经存在于数据库中。当它这样做时,它应该拒绝提交的数据,保持我的数据库干净。UI 将处理所有错误消息等。

我的端点:http ://someurl.firebaseio.com/accounts/

通过 push() 提交到 /accounts/ 的示例数据:

{fullName: "John Doe", company: "Pet's Place", email: "john@petsplace.org"}

Firebase 安全规则设置:

目标:每个人都可以写信到 /accounts/ 来注册,只有唯一的值和长度和 isString 的验证。匿名用户不允许阅读。

{
"rules": {
    ".read": "auth !== null",
    ".write": "auth !== null",
    "accounts": {
        ".write": "auth !== null && newData.exists()",
        "$accountID": {
            ".read": false,
            ".validate": "newData.hasChildren(['fullName', 'company', 'email'])",
            "fullName": {
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50 && !newData.val().contains('admin')"
            },
            "company": {
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50"
            },
            "email": {
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50"
            }
        }
    }
}
}

(多次)提交后的结果

{
"accounts" : {
"-JY249g70KL-XG0c6ekM" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
},
"-JY249y2IwFWAYwEqC4Q" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
},
"-JY24ACApcPH2_jiU5PD" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
},
"-JY24AL8QOKQRiTh3Oqm" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
}
}
}
4

1 回答 1

1

通过使用电子邮件地址作为键,您可以确保每个电子邮件地址只有一个条目:

var fbRef = new Firebase('https://someurl.firebaseio.com/');

// create a new user somehow
var newUser = {
    fullName: "John Doe", 
    company: "Pet's Place", 
    email: "john@petsplace.org"
}

// escape '.' because it can not be used as a key in FB
function escapeEmail(email){
    return email.replace(/\./g, ',');
}

fbRef.child('accounts').child(escapeEmail(newUser.email)).set(newUser, function(err) {
    if(err) {
        // if there was an error, the email address already exists
    }
);

然后在您的规则中验证密钥(电子邮件地址)是否不存在:

{
    "rules": {
        ".read": true,
        "accounts": {
            "$account": {
                ".write": true,
                ".validate": "!root.child('accounts').child(newData.child('email').val().replace(/\./g, ',')).exists()"
            }
        }
    }
}

还可以在这里查看一些附加信息: What Firebase rule will prevent duplicates in a collection based on other fields? 在这里: 如何防止 Firebase 中重复的用户属性?

于 2014-10-09T00:21:18.640 回答