Можете ли вы контролировать отдельные свойства в правилах безопасности баз данных Firebase в реальном времени? - PullRequest
0 голосов
/ 02 мая 2019

Мне нужно контролировать доступ к отдельным свойствам в пользовательском объекте в каталоге users в firebase rtdb.Мои текущие правила таковы:

{
  "rules": {
    "users": {
      "$uid": {
        "name": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "plans": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "survey": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "survey_done": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "notes": {
          ".write": "auth.uid === 'adminID'",
            ".read": "auth.uid === 'adminID'"
        },
        "status": {
          ".write": "auth.uid === 'adminID'",
            ".read": "auth.uid === 'adminID'"
        }
      }
    },
    "sending": {
      ".write": "auth.uid === 'adminID'",
      ".read": "auth.uid === 'adminID'"
    }
  }
}

Администратор должен иметь возможность доступа ко всем данным, но когда я вхожу в него как веб-приложение в своем веб-приложении, я получаю ошибку access_denied.

Кроме того, пользователь (не администратор) должен иметь возможность видеть свои свойства name, plans, survey and survey_done, но не другие, защищенные администратором.Когда пользователь делает запрос на чтение users/their-user-id, я получаю ту же ошибку, что и выше.В идеале он просто возвращает все свойства, к которым у пользователя есть доступ, но единственный способ, которым пользователь может получить к ним доступ, - это запрос на чтение по отдельности.

Я использую запрос: firebase.database().ref("users").child(id).once("value")

1 Ответ

1 голос
/ 02 мая 2019

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

Обычно люди делят узел на двух потомков и защищают каждого потомка отдельно, исходя из ролей, требуемых от пользователя. Итак, в вашем случае будет один узел, содержащий имя, планы, опрос и survey_done. Тогда был бы другой узел для заметок и статуса. Каждый контейнерный узел будет иметь разные разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...