2015-08-19 5 views
1

После того, как я ударил головой о стену, что, казалось бы, было простой проблемой, я подумал, что лучше попросить о помощи.Безопасность - модели Async - Firebase

Я создаю приложение EmberFire, которое позволяет пользователям аутентифицироваться с помощью простого входа. После аутентификации пользователь может хранить определенные элементы для последующего поиска.

У меня есть модели определяется как так:

USER:

export default DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    dateOfBirth: DS.attr('date'), 
    registeredAt: DS.attr('date'), 
    compentencies: DS.hasMany('competency', { async: true }) 
}); 

КОМПЕТЕНЦИЙ:

export default DS.Model.extend({ 
    title: DS.attr('string'), 
    endDate: DS.attr('date'), 
    user: DS.belongsTo('user', { async: true }) 
}); 

Они хранятся в firebase дб в denormalised ибо, как я хотел бы, чтобы они быть.

enter image description here Возникает проблема с поиском сохраненных данных. Я не уверен, как я должен блокировать компетенции до конкретного пользователя?

Способ каскада правил в FireBase Я не уверен, возможно ли это в этой форме, но мне кажется, что мне не нужно сохранять каждую компетенцию во встроенной форме под каждым пользовательским узлом.

Я знаю, что могу просто разрешить доступ для чтения ко всем моделям «Компетентность» с помощью this.store.find («компетенция»), а затем отфильтровать их на клиенте, но это не соответствует безопасности, которую я ожидал бы.

Любая помощь будет большой благодарностью.

Райан

+0

1) Ваш бэкэнд может передавать компетенции как идентификаторы '{user: {компетенции: [1,2]}}' 2) Ваш бэкэнд знает, что запрашивает пользователь, не так ли? Вы можете ответить на 'this.store.find ('competency')' с компетенциями только зарегистрированного пользователя. Это простой, безопасный и правильный путь. –

+0

Спасибо за ваш ответ, однако я не понимаю, как область действия «this.store.find» («компетенция»). Я думал, что сделает запрос/полномочия на сервере, что в Firebase может вернуть все компетенции или нет? – RLW

+0

Мой бэкэнд знает, какой пользователь запрашивает информацию. Тем не менее, рассмотрение вопроса - это еще один вопрос. – RLW

ответ

2

Чтобы разрешить доступ для чтения к компетенции, если компетенция принадлежит пользователю, который в данный момент зарегистрирован в вы можете использовать $competencyId (вы можете заменить «competencyId» с любой действительной строкой). Использование $competencyId ограничивает доступ к определенному узлу под competencies/, а не разрешает доступ ко всему дереву.

"rules": { 
    "competencies": { 
    "$competencyId": { 
     ".read": "data.child('user').val() === auth.uid" 
    } 
    } 
}