Правило Firebase RTDB запрещает «устанавливать», но все же позволяет «обновлять» - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь разрешить только запись / обновление моей таблицы Firebase, только если у нее есть дочерний элемент "A_Key".Мне удалось предотвратить "установить" в симуляторе правил Firebase, но не могу предотвратить "обновление".Симуляция «обновления» всегда успешна.

Я пытался записать это в таблицу.

{
    "objectId" : "XXaabb",
    "value" : 135
}

Вот мои правила

"MyTable": {
    "$uid": {
    ".read": "auth.uid == $uid",
    ".write": "auth.uid == $uid",
    ".validate": "newData.hasChild('A_Key') && newData.child('A_Key').val() === '123456'"
    }
}

Имитация набора запрещена,Что я и хочу.Однако смоделированное обновление разрешено.Это не то, что я хочу.

Мой желаемый результат - оба должны быть отклонены.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Я сделал одно небольшое изменение, и теперь оно работает

newData.hasChild('A_Key')

должно быть

newData.child('A_Key').exists()
0 голосов
/ 18 июня 2019

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

"myTable": {
  "$uid": {
    ".write": "(((data.val() == null && (auth.uid == $uid)) && newData.child('A_key').val() != null) || (((data.val() != null && newData.val() != null) && (auth.uid == $uid)) && data.child('A_key').val() != null))",
    ".read": "(auth.uid == $uid)"
  }
}

Эквивалент болта:

path /myTable/{uid} {
    read() {isCurrentUser(uid)}
    create() {isCurrentUser(uid) && this.A_key != null}
    update() {isCurrentUser(uid) && prior(this.A_key) != null}
}

isCurrentUser(id) {
  auth.uid == id
}

Если вы хотите, чтобы в обновлении значение A_key не изменялось, используйте это:

"myTable": {
      "$uid": {
        ".write": "(((data.val() == null && (auth.uid == $uid)) && newData.child('A_key').val() != null) || (((data.val() != null && newData.val() != null) && (auth.uid == $uid)) && data.child('A_key').val() == newData.child('A_key').val()))",
        ".read": "(auth.uid == $uid)"
      }
    }

Эквивалентный болт:

path /myTable/{uid} {
    read() {isCurrentUser(uid)}
    create() {isCurrentUser(uid) && this.A_key != null}
    update() {isCurrentUser(uid) && prior(this.A_key) == this.A_key}
}

isCurrentUser(id) {
  auth.uid == id
}

https://github.com/FirebaseExtended/bolt/blob/master/docs/guide.md

...