Как проверить эту структуру данных с помощью правил безопасности Firebase?

Пока не повезло с правилами Firebase Security.

у меня есть это

{
    "rules": {
       "users": {
          "$user_id": {
            ".read": true,
            ".write": "auth !== null && auth.uid === $user_id",
            "profile": {
               ".validate": "newData.hasChildren(['first_name', 'last_name'])"
            }
         }
      }
    }
}

Я отправляю данные и для профиля, и один из них пуст... он позволяет писать как угодно. Я получаю такие данные...

{
  "users" : {
    "simplelogin:25" : {
       "profile" : {
          "first_name" : "John",
          "last_name" : ""
       }
  },
    "simplelogin:26" : {
      "profile" : {
        "first_name" : "Bob",
        "last_name" : ""
      }
    }
  }
}

Любая помощь в том, как заставить работать вышеуказанные правила? Кажется, я не могу заставить его правильно проверить.


person justbane    schedule 03.05.2015    source источник


Ответы (1)


Ваше правило проверки:

".validate": "newData.hasChildren(['first_name', 'last_name'])"

Таким образом, новые данные действительны, если они имеют свойства first_name и last_name.

Вы отправляете этот объект через:

"profile" : {
  "first_name" : "John",
  "last_name" : ""
}

Этот объект имеет свойства first_name и last_name, поэтому он действителен в соответствии с вашим правилом.

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

"profile": {
   ".validate": "newData.hasChildren(['first_name', 'last_name'])",
   "first_name": {
       ".validate": "newData.isString() && newData.val().length >= 10"
   },
   "last_name": {
       ".validate": "newData.isString() && newData.val().length >= 10"
   }
}

Первый .validate гарантирует, что профиль имеет (как минимум) first_name и last_name свойства. Другие .validate правила гарантируют, что они имеют правильный тип и минимальную длину.

person Frank van Puffelen    schedule 03.05.2015
comment
Спасибо, Фрэнк - это имеет смысл! - person justbane; 04.05.2015
comment
Еще одна информация для других! Мы должны указать .validate для всех узлов в hasChildren. Если нет, мы получим ошибку отказа в доступе :( - person Chemical Programmer; 21.07.2016
comment
Похоже, у тебя была другая проблема @ChemicalProgrammer. Если он сохраняется, лучше открыть новый вопрос. - person Frank van Puffelen; 21.07.2016