2014-09-03 47 views
23

Kullanıcı rollerine bağlı olarak Firebase'de "yazma" güvenlik kuralları uygulamak istiyorum.
Benim veri yapısı şu şekildedir:Firebase: Kullanıcı rollerine bağlı olarak güvenlik kuralları ayarla

+ myapp 
    + users 
    + john 
     + email: "[email protected]" 
     + roles 
     + administrator: true 
    + mary 
     + email: "[email protected]" 
     + roles 
     + moderator: true 
    + ... 
    + documents 
    + -JVmo6wZM35ZQr0K9tJu 
     + ... 
    + -JVr56hVTZxlAI5AgUaS 
     + ... 
    + ... 

İstediğim - örneğin - sadece yönetici kullanıcılar belgeleri yazabilirsiniz.
Bunlar geldiniz kurallar şunlardır:

{ 
    "rules": { 
    ".read": true, 
    "$documents": { 
     ".write": "root.child('users').child(auth.uid).child('roles').child('administrator').val() === true" 
    } 
    } 
} 

Ama çalışmıyor: bile yöneticisi, kullanıcıların belgeleri yazabilirsiniz ...
Firebase güvenlik kurallarının benim anlayış tamamen kusurlu mı?

GÜNCELLEME: Sadece Jenny'nin cevap önce (ister inan ister inanma :-), ben onun Kato'nun Yorum dayalı elbette (sağlamaktadır tam aynı çözümü uygulamaya vermedi). Bunun yerine,

"FIREBASE WARNING: on() or once() for /documents failed: Error: permission_denied: Client doesn't have permission to access the desired data. " 

Yani bu yapı ile geldi:
rağmen, bazı testler yaparak, Kuralların yapısını

{ 
    "rules": { 
    "documents" { 
     "$document" { 
     ".read": "root.child('users').child(auth.uid).child('roles').child('documents').child('read').val() === true", 
     ".write": "root.child('users').child(auth.uid).child('roles').child('documents').child('write').val() === true" 
     } 
    } 
    } 
} 

işi izin veremezdim ... Hep böyle bir uyarı var : gerçekten benim için çalışıyor

{ 
    "rules": { 
    "documents" { 
     ".read": "root.child('users').child(auth.uid).child('roles').child('documents').child('read').val() === true", 
     ".write": "root.child('users').child(auth.uid).child('roles').child('documents').child('write').val() === true" 
    } 
    } 
} 

: bir kullanıcı üzerinde gerçek bir roller/müşterileri okuma/düğüm ayarlarsanız o tüm belgeleri okuyabilir, aksi halde yoktur (ve w için aynı ayin).

Benim şüpheler şimdi şunlardır: (Kato önerdiği gibi)

  • neden ilk kuralı izin veremezdim çalışır?
  • Yaptığım gibi bir kuralda olası bir güvenlik deliği görüyor musunuz?
  • her bir belgesinin okunabilirliğine/yazılabilirliğine izin vermeniz veya reddetmeniz gerekmiyor olsa bile gerekli/yararlı değişkenleri "$" kullanarak kullanmakla ilgili kurallardır, ancak sadece okunabilirliğine izin vermek/reddetmek istiyorsanız Bir düğümün bütün olarak yazılabilirliği?
+6

, ben muhtemelen bir olan (auth.uid eşleşmeyen tahmin ediyorum (Bu cevap forma @Kato tarafından yorumların çoğunlukla bir araya gelmesinden meydana idi) 'twitter: 2544215' gibi basit bir giriş kimliği. Ayrıca, '.write' kuralınız büyük olasılıkla $ dokümanlar (kök dışı) yerine belgeler/$ belgesi altında olmalıdır, aksi takdirde root üzerindeki herhangi bir yola erişiminiz olacaktır. – Kato

+0

Teşekkürler, Kato! ... Kullanıcılarımın anahtarını mutlaka değiştireceğim (kullanıcı adından uid'e). Bu yaygın bir uygulamadır (kullanıcıları uid ile endeksleme)? Aynı kullanıcı için birden fazla kimlik doğrulama sağlayıcısına izin vermek istersek ('twitter' ve 'password') ne yapmalıyım? Birden çok anahtar altında aynı kullanıcı ile sonuçlanmalıyım ... :-(Ama her şeyden önce, bir 'sosyal' sağlayıcıyla giriş yaparsa veya onu imzalamam gerekiyorsa Kullanıcılarım koleksiyonuma bir kullanıcı eklemeliyim? – MarcoS

+0

Bu soruların tümü, kullanım durumunuza özeldir.Onlar nasıl oturum açtıklarından bağımsız olarak, kullanıcılarınızla ilgili bazı verileri depolamak isteyebilirsiniz. Birden fazla sağlayıcıdan bir hesapta oturum açmanıza izin veren siteleri düşünemiyorum (farklı servislerden gelen besleme içeriğini birleştiren toplu servisler dışında başka bir deyişle, bu rotayı almak istiyorsanız, kendi belirteçlerinizi ve kimliğinizi oluşturun. – Kato

cevap

24

kullanıcı kayıtlarının adlarına dayanarak, onlar twitter:2544215 olarak, muhtemelen Simple Login kimliği olan bu tür auth.uid uyuşmuyor. kullanıcıların ayarlayarak

Başlangıç ​​onların Basit Giriş uid tarafından saklanmasına: Yöneticiler documents erişebilmesi için

+ myapp 
    + users 
    + twitter:2544215 
     + email: "[email protected]" 
     + roles 
     + administrator: true 
    + twitter:2544216 
     + email: "[email protected]" 
     + roles 
     + moderator: true 
    + ... 
    + documents 
    + -JVmo6wZM35ZQr0K9tJu 
     + ... 
    + -JVr56hVTZxlAI5AgUaS 
     + ... 
    + ... 

Sonraki bir güvenlik kuralı ekleyin. Özel kullanım durumunuza bağlı olarak burada birkaç seçeneğiniz var.

{ 
    "rules": { 
    "documents": { 
     ".write": "root.child('users').child(auth.uid).child('roles').child('administrator').val() === true" 
    } 
    } 
} 

farkı:

{ 
    "rules": { 
    "documents": { 
     "$documents": { 
     ".write": "root.child('users').child(auth.uid).child('roles').child('administrator').val() === true" 
     } 
    } 
    } 
} 
alternatif
  • Veya, onlara tüm koleksiyona erişim vermek:

    1. yöneticilerin her belgenin içeriğine yazma erişimi vermek için Bu ikisi arasında güvenlik kuralını bir adım ileriye taşıyan $documents değişken hiyerarşiye

      kullanıcı kayıtlarının adlarına dayanarak

  • +0

    Teşekkürler, Jenny! Lütfen cevabınızdan sonra soruma bakın. – MarcoS

    İlgili konular