Правило безопасности Firebase и проверка уникальных записей

Я создаю приложение AngularjS, которое позволяет пользователям (аутентифицированным анонимно Firebase) отправлять свое полное имя, компанию и адрес электронной почты, чтобы попасть в наш список рассылки.

Что я хочу сделать, так это отключить форму ввода данных пользователями дважды, таким образом проверяя, существуют ли уже отправленные данные в базе данных. Когда это произойдет, он должен отклонить отправленные данные, сохраняя мою БД в чистоте. Пользовательский интерфейс позаботится обо всех сообщениях об ошибках и так далее.

Моя конечная точка: http://someurl.firebaseio.com/accounts/

Примеры данных, отправленных в / accounts / через push ():

{fullName: "John Doe", company: "Pet's Place", email: "[email protected]"}

Настройка правил безопасности 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" : "[email protected]",
  "fullName" : "John Doe"
},
"-JY249y2IwFWAYwEqC4Q" : {
  "company" : "Pet's Place",
  "email" : "[email protected]",
  "fullName" : "John Doe"
},
"-JY24ACApcPH2_jiU5PD" : {
  "company" : "Pet's Place",
  "email" : "[email protected]",
  "fullName" : "John Doe"
},
"-JY24AL8QOKQRiTh3Oqm" : {
  "company" : "Pet's Place",
  "email" : "[email protected]",
  "fullName" : "John Doe"
}
}
}

person svh1985    schedule 29.09.2014    source источник


Ответы (1)


Используя адрес электронной почты в качестве ключа, вы можете убедиться, что для каждого адреса электронной почты будет только одна запись:

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

// create a new user somehow
var newUser = {
    fullName: "John Doe", 
    company: "Pet's Place", 
    email: "[email protected]"
}

// 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()"
            }
        }
    }
}

Также посмотрите здесь дополнительную информацию: Какое правило Firebase предотвращает дублирование в коллекции на основе других полей? и здесь: Как предотвратить дублирование свойств пользователя в Firebase?

person magikMaker    schedule 09.10.2014
comment
Танки за ваш ответ, я попробую. Отправлю свои выводы сюда. - person svh1985; 14.10.2014
comment
@magicMaker, эти правила проверки не работают в текущей Firebase`` приводит к ошибке, которую вы не можете сохранить. - person Dhruv Ghulati; 22.11.2016