База данных Firebase в реальном времени - отказано в разрешении при чтении пути, если значение равно нулю - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь прочитать путь в моей базе данных Firebase Realtime /users/uid1, где значение в пути null.По сути, его не существует.Мои правила безопасности позволяют читать по пути (правила ниже).Когда на самом деле чтение данных, разрешение отказано.

Правила безопасности следующие:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "root.child('users').child($uid).child('mUser_Role').child('mRole_PermissionLevel').val() > 400 || root.child('users').child(auth.token.phone_number).child('mUser_Role').child('mRole_PermissionLevel').val() == 500"
      }
    }
  }
}

Попытка чтения /users/uid1 при /users/myuid/mUser_Role/mRole_PermissionLevel == 500, равном true, завершается неудачей с запрещенным разрешением.

Как Firebase определяет, что в разрешении должно быть отказано в случае, когда значение равно null?Разве это чтение не должно быть разрешено и возвращать dataSnapshot, где dataSnapshot.exists() возвращает false?

Я не указал никаких правил для data при пути null, и чтение завершается успешно, если значение в пути не null


РЕДАКТИРОВАТЬ - Чтобы воспроизвести этот сценарий -

1.Загрузите JSON в корень базы данных Firebase в реальном времени db-

{
  "users" : {
    "+9198100xxxxx" : {
      "mUser_Id" : "+9198100xxxxx",
      "mUser_ProfilePicUrl" : "url",
      "mUser_Role" : {
        "mRole_Name" : "Employee",
        "mRole_PermissionLevel" : 500
      }
    },
    "+9198100yyyyy" : {
      "mUser_Id" : "+9198100yyyyy",
      "mUser_ProfilePicUrl" : "url",
      "mUser_Role" : {
        "mRole_Name" : "Employee",
        "mRole_PermissionLevel" : 500
      }
    }
  }
}

2.Правила базы данных Firebase в реальном времени (фактически используются для этого узла) -

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "root.child('users').child($uid).child('mUser_Role').child('mRole_PermissionLevel').val() > 400 || root.child('users').child(auth.token.phone_number).child('mUser_Role').child('mRole_PermissionLevel').val() == 500"
      }
    }
  }
}

3.Использовать симулятор правил безопасности Firbease -

Тип симуляции - read

Местоположение - /users/+9198100zzzzz (сбой симулированного чтения)

Местоположение - /users/+9198100yyyyy (симуляцияуспешное чтение)

Аутентифицировано - yes

Поставщик - custom

Полезная нагрузка токена аутентификации -

{
  "provider": "phoneauth",
  "uid": "6f2eed52-b2e9-409a-b5f1-dc307c7f6671",
  "token":{
      "phone_number": "+9198100xxxxx"
  }
}

enter image description here enter image description here

1 Ответ

0 голосов
/ 14 декабря 2018

Несуществующие узлы оцениваются в null, поэтому ваше правило по существу оценивается в:

null > 400 || 500 == 500

Используемый механизм правил строго типизирован, что означает, что null > 400 выдает ошибку вместо оценки вfalse.

Решение состоит в том, чтобы сначала проверить наличие узла, прежде чем сравнивать его значение.Итак:

".read": "
 (
  root.child('users').child($uid).exists() &&
  root.child('users').child($uid).child('mUser_Role').child('mRole_PermissionLevel').val() > 400
 ) || (
  root.child('users').child(auth.token.phone_number).exists() &&
  root.child('users').child(auth.token.phone_number).child('mUser_Role').child('mRole_PermissionLevel').val() == 500
 )
"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...