Как обрабатывать правила безопасности базы данных Firebase при нескольких обновлениях? - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время я пытаюсь определить правила безопасности базы данных.Во время создания профиля пользователя я создаю объект обновления для базы данных в форме:

firebase.auth().onAuthStateChanged(firebaseUser => {
          const currentkey= firebaseUser.uid;
            var userCreateObject = {};
            userCreateObject['users/' + currentkey + '/username'] = username;
            userCreateObject['users/' + currentkey + '/email'] = email;
            userCreateObject['users/' + currentkey + '/birthdate'] = birthdate;
            userCreateObject['usernames/' + username] = currentkey;
            userCreateObject['followed/' + currentkey + '/MAINITEM/item'] = item;
            userCreateObject['filters/' + currentkey + '/MAINITEM/item'] = item;
            //Start account for the user
            firebase.database().ref().update(userCreateObject).then(function() {...})
...
});

Однако следующие правила безопасности приводят к сбою операции:

{
  "rules": {
    "filters": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    },
    "followed": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    },
    "usernames": {
        ".read": "true",
        ".write": "auth.uid != null && (!data.exists())"
    },
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    }
  }
}

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

Кроме того, существует ли конкретный способ тестирования такого рода правил?Определяя их впервые, я выполнял симуляции в виде:

/ users / someuidImadeup

{
  "username": "username",
  "email": "email",
  "birthdate": "birthdate"
 }

, который работал правильно.И

/ users

{ "someuidImadeup":
 {
  "username": "username",
  "email": "email",
  "birthdate": "birthdate"
 }
}

Не удалось.Поэтому я предполагаю, что обновления обрабатываются в этой форме.

1 Ответ

0 голосов
/ 13 мая 2018

В вашем правиле отсутствует символ подстановки для /usernames.

"usernames": {
    "$username": { /* this line/level is new */
      ".read": "true",
      ".write": "auth.uid != null && (!data.exists())"
    }
}

Без этого дополнительного уровня правило проверяет отсутствие имен пользователей, что, вероятно, никогда не соответствует действительности.

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

".write": "auth.uid != null && !data.exists() && newData.val() == auth.uid"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...