Правила БД Firebase установлены только для чтения владельцем - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть простой демонстрационный проект, который я скачал, и я пытаюсь внести некоторые простые изменения. Но я не могу понять, как я могу установить правила БД, чтобы только кто-то, КТО СОЗДАЛ проект, мог открыть связь с проектом. Теперь можно открыть ссылку на проект для всех, кто вошел в систему.

ФАЙЛ ПРАВИЛ БД:

{
  "rules": {
    ".read": "auth !== null",
    ".write":"auth !== null",
    "users": {
      "$uid": {
        ".write": "auth !== null && $uid === auth.uid",
        ".read": "$uid === auth.uid"
      }
    },
    "projects": {
      ".indexOn": ["createdBy"]
    }
  }
}

Мне интересно добавить строки в "projects":, например ".read": "createdBy === auth.uid", но это не работает. Я буду благодарен за любую помощь.

1 Ответ

0 голосов
/ 02 ноября 2019

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

. На верхнем уровне ваших правил вы предоставляете пользователям это разрешение:

".read": "auth !== null",
".write":"auth !== null",

С учетом приведенного выше объясненияэто означает, что любой зарегистрированный пользователь имеет доступ на чтение / запись ко всей базе данных. Любые правила чтения / записи, которые у вас есть на более низких уровнях, просто игнорируются.

Поэтому первым шагом будет удаление этих правил доступа верхнего уровня.


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

"projects": {
  ".indexOn": ["createdBy"],
  "$projectid": {
    ".read": "auth.uid == data.child('createdBy').val()"
  }
}

При этом пользователь может читать /projects/myproject, если он создал myproject.


Обратите внимание, что с вышеуказанными правилами, ни один пользователь не можетчтение из /projects, поскольку вы никому не предоставляете права на чтение на этом узле. Безопасность Firebase не фильтрует никакие данные от вашего имени, они просто проверяют, разрешена операция или нет. Подробнее об этом см. В документации по правилам, а не фильтрам .

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

  1. Запрос, запрашивающий только эти проекты.

    ref.orderByChild("createdBy").equalTo(uid)
    
  2. Правило /projects, позволяющее только этоquery.

    "projects": {
      ".read": "auth.uid != null &&
                query.orderByChild == 'createdBy' &&
                query.equalTo == auth.uid"
    }
    

Так что теперь вы разрешаете чтение /projects только тогда, когда оно выполнено с запросом, который запрашивает только те проекты, которые пользователь создал сам. Таким образом, правила безопасности и код работают вместе, чтобы гарантировать, что пользователь получает только те данные, которые ему разрешено читать.

Подробнее об этой последней теме см. Документацию по правилам на основе запросов .

...