2013-09-07 12 views
13

Staram się ustawić odpowiednie reguły bezpieczeństwa dla mojej aplikacji.Reguła bezpieczeństwa Firebase daje odmowę uprawnień?

Przegląd aplikacji, którą piszę, to to, że użytkownicy mogą się zarejestrować za pomocą adresu e-mail i hasła (używam do tego prostego logowania do Firebase). Po zalogowaniu użytkownik może dodać swoje todos.

angularFire('https://<firebase>/firebaseio.com/todos', $scope, 'todos'); 

Aby dodać nowe todo do dowolnego użytkownika, po prostu aktualizuję model todos.

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

Te zasady bezpieczeństwa Używam ograniczyć niezarejestrowanego użytkownika, aby dodać dowolny todo:

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

Ale to nie pozwala nawet uwierzytelniony użytkownik pisać żadnych danych i rzuca błąd, "OSTRZEŻENIE PRZECIWPOŻAROWE: on() lub once() for/todos failed: Błąd: permission_denied."

Ale jeśli dodaję następujące dane w symulatorze, działa zgodnie z oczekiwaniami.

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

Oto 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

Możesz spróbować użyć symulatora bezpieczeństwa w Forge, aby zobaczyć, dlaczego to nie działa. Dwa komentarze: 1) Wydaje się, że piszesz tablicę z jednym obiektem, prawdopodobnie powinien to być tylko jeden obiekt. 2) Zmienna "$ todos" powinna być po prostu "todos". – Anant

+0

@Anant: Thx za odpowiedź. Jak już powiedziałeś, usunąłem $ i zmieniłem regułę sprawdzania poprawności za pomocą '.validate": "auth.email == '[email protected]'" 'gdzie' a @ b.com' jest zarejestrowanym użytkownikiem - działa to jednak nie "" .validate ":" '[email protected]' == newData.child ('user'). val() "'. Czy można zobaczyć, co ma nowy plik danych? – codef0rmer

+0

@Anant: Zaktualizowałem pytanie, aby zapewnić Ci większą jasność. Jak powiedziałeś, $ nie jest potrzebne, dlaczego jest używane wszędzie w dokumentacji? – codef0rmer

Odpowiedz

16

push dodaje nowe dziecko z losowo wygenerowanym ID (w porządku chronologicznym) do /todos. Tak więc newData nie wskazuje na to, co według Ciebie wskazuje. Zmień swoje zasady:

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

Aktualizacja: Powyższa zasada jest ważna, ale angularFire obecnie pisze całą tablicę z powrotem do serwera powodując auth na niepowodzenie. Można użyć angularFireCollection zamiast tylko pisać nowe TODO z powrotem, tak jak poniżej:

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

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

Jest kwestią otwartą, aby zoptymalizować zachowanie angularFire kiedy nowe elementy są dodawane do listy, ale w międzyczasie można użyć angularFireCollection do uzyskać właściwe zachowanie.

+0

Próbowałem już tego, ale bez powodzenia. – codef0rmer

+1

Problem jest w angularFire, opublikowano obejście listy dyskusyjnej firebase-talk (zamiast tego użyj polecenia angularFireCollection.add). – Anant

Powiązane problemy