2015-01-05 4 views
5

sto avendo problemi di applicazione delle norme di sicurezza di base con Firebase (ho letto la documentazione sulla Firebase e StackExchange ma non può rendere le norme di sicurezza del lavoro):regole di sicurezza di base con Firebase

Il modello (rappresentanza Emberjs del modello) :

App.User = DS.Model.extend({ 
    uid: DS.attr('string'), 
    displayName: DS.attr('string'), 
    books: DS.hasMany('statistic', { inverse: 'user', async: true}), 
    actions: DS.hasMany('action', { inverse: 'user', async: true}), 
}); 


App.Action = DS.Model.extend({ 
    date: DS.attr('date'), 
    actionType: DS.attr('string'), 
    comment: DS.attr('string'), 
    user: DS.belongsTo('user', {inverse: 'actions', async: true}) 
}); 


App.Book = DS.Model.extend({ 
    name: DS.attr('string'), 
    description: DS.attr('string'), 
    user: DS.belongsTo('user', { inverse: 'books', async: true}) 
}); 

I 3 nodi (modelli) sono memorizzati direttamente nella radice dell'app di Firebase. I modelli Book e Action hanno un campo user (proprietà).

Quali sono le regole per scrive in modo che:

  1. l'utente identificato nel campo utente del modelli di azione (nodi) Libro e può avere in lettura e scrittura ai propri dati solo? (Il valore del campo user in Libro e Azione deve essere uguale al valore di auth.uid in Firebase affinché all'utente vengano concessi i privilegi di lettura e scrittura.)
  2. Che gli utenti possano accedere solo alle informazioni del modello Utente (nodo) che appartengono a loro?

Grazie

risposta

2

E 'importante capire la struttura dei dati nel Firebase.

Fondamentalmente, ci sono due modi per scrivere le regole di sicurezza. È possibile impostare le regole di sicurezza direttamente sotto i libri/oppure scrivere separatamente le regole di sicurezza per ciascun attributo del modello. O una combinazione di entrambi, ma assicurati di aver capito prima il principio top-down.

Preferisco scrivere le regole per ciascun attributo separatamente, è più facilmente gestibile e controllabile.

Ma nel tuo caso, perché gli altri utenti non hanno bisogno di acces una parte di libri o degli utenti, è facile scrivere le regole per l'intero modello:

"rules" :{ 
 
    "books": { 
 
    "$book_id": { 
 
     ".read": "data.child('user').val() === auth.uid && auth !== null", 
 
     ".write": "!data.exists() && newData.child('user').val() === auth.uid || data.child('user').val() === newData.child('uid').val() && auth !== null" 
 
    }, 
 
    "users": { 
 
    "$user_id": { 
 
     ".read": "data.child('uid') === auth.uid", 
 
     ".write": "!data.exists() && newData.child('uid').val() === auth.uid || data.child('uid').val() === newData.child('uid').val()" 
 
    } 
 
    } 
 
    } 
 
}

I non testare queste regole, possono contenere difetti, si prega di utilizzare lo strumento di simulazione per renderli a prova di proiettile:]

Controllare il mio post medio per maggiori informazioni: https://medium.com/@martinmalinda/emberfire-is-awesome-but-querying-data-and-writing-security-rules-can-be-a-pain-f5370f4decb