2013-09-07 16 views
13

Non riesco a impostare le corrette regole di sicurezza per la mia applicazione.La regola di sicurezza di Firebase dà il permesso negato?

Una panoramica dell'applicazione che sto scrivendo è che gli utenti possono registrarsi usando e-mail e password (sto usando Firebase Simple Login per questo che funziona perfettamente). Una volta effettuato l'accesso, l'utente può aggiungere i propri todos.

E per aggiungere un nuovo todo a qualsiasi utente, ho semplicemente aggiornato il modello di todos.

$scope.todos.push({ 
    user: '[email protected]', 
    todo: 'What to do?' 
}); 

Questa regole di sicurezza che sto usando per limitare l'utente non registrato per aggiungere qualsiasi todo:

{ 
    "rules": { 
     ".read": true, 
     "todos": { 
     ".write": "auth != null", 
     ".validate": "auth.email == newData.child('user').val()" 
     } 
    } 
    } 

Ma non permette nemmeno un utente autenticato di scrivere qualsiasi dato e gettando un errore, "WARNING FIREBASE: on() o once() per/todos non riuscito: errore: permesso_dato".

Ma se aggiungo i seguenti dati nel simulatore, allora funziona come previsto.

{user: "[email protected]", todo: 'What to do?'} 

Ecco il log:

/todos:.write: "auth != null" 
    => true 
/todos:.validate: "auth.email == newData.child('user').val()" 
    => true 
/todos:.validate: "auth.email == newData.child('user').val()" 
    => true 

Write was allowed. 
+0

Puoi provare a utilizzare il simulatore di sicurezza in Forge per capire perché questo non funziona. Due commenti: 1) Sembra che tu stia scrivendo un array con un oggetto, probabilmente dovrebbe essere solo un oggetto. 2) La variabile "$ todos" dovrebbe probabilmente essere solo "todos". – Anant

+0

@Anant: Thx per la risposta. Come hai detto, ho rimosso $ e modificato la regola di convalida con "" .validate ":" auth.email == '[email protected]' "' dove 'a @ b.com' è un utente registrato - questo funziona ma not '" .validate ":" '[email protected]' == newData.child ('utente'). val() "'. È possibile vedere che cosa ha newData? – codef0rmer

+0

@Anant: ho aggiornato la domanda per darti più chiarezza. Come hai detto, $ non è necessario allora perché è usato ovunque nella documentazione? – codef0rmer

risposta

16

push aggiunge un nuovo bambino con un ID generato in modo casuale (in ordine cronologico) a /todos. Quindi, newData non punta a ciò che pensi che stia puntando. Modificare le regole per:

{ 
    "rules": { 
    ".read": true, 
    "todos": { 
     "$todoid": { 
     ".write": "auth != null", 
     ".validate": "auth.email == newData.child('user').val()" 
     } 
    } 
    } 
} 

Aggiornamento: Sopra regola è valida ma angularFire attualmente scrive l'intero array al server causando l'autenticazione al sicuro. È possibile utilizzare angularFireCollection invece, di scrivere solo il nuovo TODO posteriore, in questo modo:

$scope.todos = angularFireCollection(new Firebase(URL)); 

$scope.todos.add({user: '[email protected]', todo: 'What to do?'}); 

C'è una questione aperta per ottimizzare il comportamento di angularFire quando i nuovi elementi vengono aggiunti alla lista, ma nel frattempo è possibile utilizzare angularFireCollection per avere il comportamento giusto

+0

L'ho già provato ma senza fortuna. – codef0rmer

+1

Il problema è in angularFire, ha pubblicato una soluzione alternativa alla mailing list firebase-talk (utilizzare invece angularFireCollection.add). – Anant

Problemi correlati