2015-09-09 2 views
0

Здравствуйте, ребята,Firebase - безопасное место для размещения по запросу

Я начал работать над защитой своей Firebase. У меня есть место, содержащее список событий:

events: 
    $event1: { 
     name: test 
     ... 
    } 
    $event2: { 
     name: test2 
     ... 
    } 

В моем приложении я позволяю пользователю добавлять события, используя свое имя. Для этого, после того, как пользователь подтверждает его вход (именем_события), я ищу, существует ли имя с помощью

ref.child("events").orderByChild("name").equalTo(eventName) 

И если да, то я добавлю его в список событий пользователя. Моя проблема связана с безопасностью. Если я определяю правила безопасности, как так:

"events": { 
    "$eventId": { 
    ".read": "auth != null" 
    } 
} 

Тогда она не - это вполне ожидаемо, так как «события» место, которое целевой ссылкой Firebase, не имеет «читать» правило. Проблема в том, что я не хочу открывать местоположение «событий» для чтения всеми подключенными пользователями, так как события являются частными и должны совместно использоваться по их имени.

Итак, поскольку это имя должно быть уникальным, я мог бы использовать его в качестве ключа объекта события вместо созданного Firebase ключа (в настоящее время я использую .push(), когда создается новое событие, чтобы добавить его в список, Firebase генерирует мне ключ), но мне очень нравится, как сейчас. Поэтому я спрашиваю перед изменением: есть ли другой способ достичь того, что я собираюсь сделать?

Большое спасибо.

+0

Код, который вы включили сейчас, не подходит по той причине, которую описывает Иаков. По-видимому, мы с Джейкобом поняли, что вы пытаетесь понять. На этом этапе, вероятно, лучше всего, если вы обновите свой вопрос, чтобы включить код, который вы пытаетесь выполнить, и это не удается. –

ответ

1

Причина, по которой дело не срабатывает, заключается в том, что security rules are not filters. Правила применяются в атомном порядке. Это означает, что операция чтения или записи не выполняется немедленно, если в этом месте или в родительском местоположении, предоставляющем доступ, не существует правила. Даже если доступ к каждому дочернему пути доступен, чтение в родительском местоположении полностью завершится.

Таким образом, вы сможете читать только с узла /events/, если вы можете прочитать все дочерние элементы этого узла. Поэтому, если вы не вошли в систему или вы не вошли в систему с правильным пользователем, чтение будет терпит неудачу.

Чтобы выполнить то, что вы хотите, вы должны добавить узел /events/ каждому пользователю вашего узла /users/, в котором перечислены eventId для каждого события, в котором они входят. Тогда вам не нужен запрос на события, и вы можете просто легко получить пользовательские события, выполнив чтение на /users/$uid/events/. Затем вы можете просмотреть сведения о мероприятии с узла /events/$eventId/ и избежать любых чтений на узле верхнего уровня /events/, который запрещен правилами безопасности.

+0

Эй, Джейкоб, спасибо, что нашли время ответить. Извините, но кажется, что я сильно изменил свой вопрос, поскольку, похоже, вы не понимали, что я пытаюсь сделать. Листинг всех событий пользователя выполняется где-то еще в моем FB (я хорошо изучил мой урок, отрицал все с самого начала), и у меня нет абсолютно никаких проблем с перечислением событий пользователя. То, с чем я борюсь, позволяет пользователю добавить новое событие в этот список. Как я уже сказал в этом вопросе, для этого я должен позволить пользователю искать событие по имени, что невозможно с текущими правилами безопасности - и я не могу найти, как это сделать. –

+0

Если вы хотите, чтобы пользователи ** добавляли ** данные, но не перезаписывали существующие данные: '. .write": "! Data.exists() && newData.exists()" 'Смотрите также https: // www .firebase.com/документы/безопасность/руководство/обеспечение-данных.html # section-data-variables –

+0

@FrankvanPuffelen Спасибо, я уже внимательно прочитал все документы (и несколько раз)! Я абсолютно ничего не пытаюсь написать, я пытаюсь найти хорошее правило безопасности для данных GET с помощью запросов orderByChild + equalTo, в то время как родительское местоположение, которое является ссылкой Firebase, я использую, НЕ читается. –

Смежные вопросы