2016-02-24 6 views
0

Я почесаю голову, потому что защита Firebase работает, как я хочу. Мое приложение построено с Ember и так с EmberFire. Таким образом, структура определяется EmberFire.Как защитить мою Firebase App build с помощью EmberFire

Моя структура базы данных выглядит следующим образом:

conversations : { 
    $conversation_id { 
     messages { 
      //message data 
     } 
     users { 
      $user_id1 :true 
      $user_id2 :true 
     } 
    } 
} 

Что я хочу, что можно увидеть и написать сообщение в этом разговоре только пользователи, которые являются частью разговора. Я попробовал это правило без успеха:

"conversations" : { 
    ".indexOn" : "notify", 
    ".read" : "auth !== null && root.child('users').hasChild(auth.uid)", 
    ".write": "auth !== null && root.child('users').hasChild(auth.uid)" 
} 

Кажется, что auth.uid не может быть передан в имеетРебенок. Я также попытался следующий, потому что мой разговор идентификатор джойна идентификатора пользователей, которые участвуют в разговор:

"conversations" : { 
    ".indexOn" : "notify", 
    "$conversation" : { 
     ".read" : "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))", 
     ".write": "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))" 
    } 
} 

С этим правилом, никто не может видеть разговор, потому что узел «разговоры» не имеет .read правила , Но если я добавлю «.read: true» к узлу «разговоров», из-за правил top-bottom в Firebase, все пользователи могут видеть все разговоры.

Редактировать: второе правило имеет ту же проблему, что и первая. beginWith() ожидает строковый аргумент. И auth.uid не может быть использован Любая идея для решения моей проблемы?

Редактировать: Добавить auth! == null перед правилом, делает ошибку beginWith() ожидает, что строковый аргумент выйдет. Но оба правила все еще не работают.

+0

Вы явно указываете идентификатор беседы как соединение идентификаторов пользователей, участвующих в разговоре? – msdedwards

+0

Да. Вот что я делаю. Я не делаю, если это антипаттерн или нет. – Scandinave

+0

Ну, было бы проблемой, если бы у вас было несколько разговоров с теми же пользователями. – msdedwards

ответ

4

Проблема с вашей первой попытки заключалась в том, что вы использовали root, но должны были использовать $ chat. Root - это моментальный снимок правила, который ссылается на корень из firebase, тогда как $ chat - это переменная, которая содержит идентификатор разговора, который вы пытаетесь прочитать/записать.

"conversations" : { 
     ".indexOn" : "notify", 
     "$conversation" : { 
      ".read" : "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)", 
      ".write": "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)" 
     } 
    } 

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

  • Нет связанных вопросов^_^