Firebase Realtime Veritabanında Veri-Kural İlişkisi




Firebase üzerindeki verilerin (data) yönetimi ve güvenliği için kural (rules) ilişkisini öğreneceğiz. Ana odağımız rules olduğu için nedir, ne değildir kısımlarını detaylandırmıyorum. Basit bir tanımla; console.firebase.google.com resmi platform da geçtiği gibi gerçek zamanlı veri senkronizasyonunu destekleyen veritabanıdır.

TEMEL "2" KURAL PRENSİBİ


Firebase Console giriş yaptığımızda Veri - Kural - Yedek - Kullanım sekmeleri bizi karşılar. Tüm Veri & Kural ilişkisinin temeli iki maddeyi bağlıdır ve her kural yazdığımızda unutmamak gerekir.

  • Verileri hemen yan sekmede bulunan Kurallar ile yönet. 
  • Kuralsız veri yönetmek güvenlik açığıdır ve dataya zarar verir.

KURALLAR (RULES)


İki örnek kullanıma bakalım. Birinci sadece Development ortamında, ilk öğrenme denemelerini yaparken kalabilir. Veriler herkese açıktır ve tüm data üzerinde işlem yapılabilir. Production da "false" olmalı ve üstte yazdığım "2" ana çalışma prensibi uygulanmalıdır. Açıklama ve detaylara inerek kuralları yazının devamında öğrenmiş olacağız.

Hatalı Kural

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

Doğrusu ;

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
 

KURAL AÇIKLAMALARI


  • .read : Okuma <Koşul>
  • .write : Yazma <Koşul>
  • .validate : Validation <Koşul> (Doğrulama)
  • .indexOn : Sıralama ve Listeleme <Koşul> var ise. (Index Mantığı)

KURALLARI TANIYALIM


Firebase Panelde "Authentication" kısmını altında bulunan User'lara "Rules" içinden .auth ile ulaşılır. Sırayla yapalım;

  1. Firebase her kullanıcı için uid (Unique ID) yaratır.
  2. "Sign-in method" üzerinden E-Posta ya da diğer provider'lar seçilebilir. (Şifresiz bağlantıyı seçtim)
  3. "Users" altından kullanıcı ekleyelim. (+ butonu ile)
  4. "Rules" altından ulaşmak için;
    • $ auth.uid
    • $ auth.provider == 'google'
    • $ ... kısaca o sayfa bulunan "sütun" başlıklara üstteki syntax ile erişilir
  5. Provider Listesi;
    • Email : 'password'
    • Google : 'google'
    • Facebook : 'facebook'
    • Twitter : 'twitter'
    • Github : 'github'
    • Misafir : 'anonymous'

  • İzin verilmeyen bir provider ile işlem yapılamaz.
  • Veriler de bulunan her bir child node (JSON Düğümleri) için kural yazılabilir.
  • Her kural değişikliğinde "Yayınla" yapılmalıdır, yoksa geçerli olmaz.
  • Kurallar yazıldıktan sonra "Simülatör" ya da "Kurallar Oyun Alanı" olarak türkçeleştirilmiş butondan datayı simüle edip, testlerimizi saniyeler içinde yapabiliriz. Ekstra herhangi bir yazılım gerektirmez.
  • Manager üzerinden Credentials dosyası alıp (JSON) administrator seviyesinde seçeceğimiz geliştirme dili ile (NodeJS, Python, PHP vb.) "kurallara" sadık kalmadan işlem yaptırabiliriz. "false" bile tanımlamış olsak, bu seviyede tüm veri üzerinde read-write yapma yetkimiz olur.

UYGULAMALI ÖRNEKLER


"Users" için Auth ve JSON düğümünde User ID eşitse kontrolü. Her projeniz de mutlaka olmalıdır.

"Users":{
    "$user_id":{
        ".read": "auth.uid != null && $user_id === auth.uid",
        ".write": "auth.uid != null && $user_id === auth.uid",
    }
},

"Şehirler" için auth yapmış her kullanıcıya "read" yetkisi verelim.

"Cities":{
    ".read": "auth.uid != null",
    ".write": false,
},

root.child ile JSON objelerine erişmek istersek;

 ".read": "auth.uid != null && root.child('Users/' + auth.uid).exists()",

ya da

root.child('Users/Profile/Services' + auth.id ...

değişken gerekli ise

 root.child('Products/'+$product_id+'/test1/test2/test3')

"Index" için;

 ".indexOn":".value"; 

Yeni veriler için "write" yapılsın ama "name,email..." objeleri gelir ise kabul et diyebiliriz. Tanımlamalar dışındaki tüm dataları reddeder.

 ".write":"auth.uid !== null && newData.child('user_id').val() === auth.uid && newData.val() !== null ",
".validate":"newData.hasChildren(['name','email','phone'])"

ya da "numeric" kontrolü;

 ".validate":"newData.child(''+ auth.uid).exists() && newData.child('' + auth.uid).isNumber()",

"Ve" , "Veya" için klasik && || kullanabiliriz.

".write":"auth.uid !== null && (auth.uid === $user_id || root.child ...

Admin yetkisine sahipse;

auth.isAdmin == true,

kontrolü için ise kullanabileceğiniz;

auth.hasEmergencyTowel === true

Firebase resmi sayfasını incelemek isterseniz : https://firebase.google.com/docs/database/security/user-security

}
tarih : temmuz 2020
kategori : database

Yorum Yapmak İstersen ?
Yazılıp / Çizilenler
Konuya kimse yorum yapmamış ...