【问题标题】:Firebase security rule and check for unique recordsFirebase 安全规则并检查唯一记录
【发布时间】:2014-11-24 08:15:47
【问题描述】:

我正在构建一个 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"
}
}
}

【问题讨论】:

    标签: angularjs firebase angularfire firebase-security firebasesimplelogin


    【解决方案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? 和这里: How do you prevent duplicate user properties in Firebase?

    【讨论】:

    • 感谢您的回复,我会试一试。将我的发现发回这里。
    • @magicMaker,这些验证规则在当前的 Firebase 上不起作用``` 会导致无法保存的错误。
    猜你喜欢
    • 2017-01-02
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多