2013-09-07 28 views
13

Uygulamam için uygun güvenlik kurallarını ayarlamak için uğraşıyorum.Firebase güvenlik kuralı izin veriliyor mu?

Yazdığım uygulamanın genel bir görünümü, kullanıcıların e-posta ve parola kullanarak kendilerini kayıt edebilmeleridir (bunun için Firebase Simple Login kullanıyorum). Giriş yaptıktan sonra kullanıcı todos'unu ekleyebilir.

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

Ve herhangi bir kullanıcıya karşı yeni bir todo eklemek için todos modelini güncelliyorum.

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

herhangi todo eklemek olmayan kayıtlı kullanıcı kısıtlamak için kullanıyorum Bu güvenlik kuralları:

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

Ama daha doğrulanmış bir kullanıcı herhangi bir veri yazmak için izin vermez ve bir hata atma, "FIREBASE UYARI: on() veya/todos için bir kez() başarısız: Hata: permission_denied."

Fakat simülatörde aşağıdaki verileri eklerseniz, beklendiği gibi çalışır.

/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

Bunun neden çalışmadığını görmek için Forge'daki güvenlik simülatörünü kullanmayı deneyebilirsiniz. İki yorum: 1) Bir nesneyle bir dizi yazıyormuşsunuz gibi görünüyor, muhtemelen sadece bir nesne olmalı. 2) "$ todos" değişkeni muhtemelen "todos" olmalıdır. – Anant

+0

@Anant: Yanıt için Thx. Dediğiniz gibi $ ve değiştirilen validate kuralını ".validate" ile kaldırdım: "auth.email == '[email protected]'" 'a @ b.com' kayıtlı bir kullanıcıdır - değil ".validate": "'[email protected]' == newData.child ('kullanıcı'). val()" '. NewData ne var görmek mümkün mü? – codef0rmer

+0

@Anant: Soruyu daha fazla açıklık sağlamak için güncelledim. Dediğiniz gibi, $ gerekli değildir, o zaman neden belgelerindeki her yerde kullanılır? – codef0rmer

cevap

16

push (kronolojik sırayla) rasgele oluşturulmuş bir kimlik ile yeni bir çocuk ekler /todos için ortalama:

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

log. Yani, newData, işaret ettiğini düşündüğünüz şeyi işaret etmiyor.

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

Güncelleme: için kurallarınızı değiştirin kural Üstü geçerli ancak angularFire şu anda yetkilendirme başarısız olmasına neden sunucuya geri bütün dizi yazar.

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

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

yeni öğeler listesine eklenir angularFire davranışını optimize etmek açık bir sorun var, ama bu arada size angularFireCollection kullanabilirsiniz: Yalnızca şöyle yanıt, yeni YAPıLACAK yazmak için, bunun yerine angularFireCollection kullanabilirsiniz Doğru davranış

+0

Bunu zaten denedim ama şans yok. – codef0rmer

+1

Sorun angularFire'da, firebase-talk posta listesine bir geçici çözüm gönderdi (bunun yerine angularFireCollection.add kullanın). – Anant

İlgili konular