Firebase Realtime Database Güvenlik Kuralları, depolanan verilere erişimi kontrol etmenizi sağlar inceleyebilirsiniz. Esnek kurallar söz dizimi, Veritabanınıza yapılan tüm yazmalardan işlemlere kadar her şeyle eşleşen kurallar tek tek düğümlerde.
Realtime Database Güvenlik Kuralları, veritabanınız için bildirim temelli yapılandırmadır. Bunun anlamı şudur: ve kuralların ürün mantığından ayrı olarak tanımlanmasını sağlar. Bu birçok avantajı vardır: müşteriler güvenliği zorunlu kılma, hatalar nedeniyle ve belki de en önemlisi, verilerinizden ödün vermeden Verileri korumak için sunucu gibi bir ara davetliye gerek yoktur. göz atabilirsiniz.
Bu konuda, temel söz dizimi ve yapı Realtime Database Güvenlik Kuralları açıklanmaktadır tam kural kümeleri oluşturmak için kullanılır.
Güvenlik Kurallarınızı Yapılandırma
Gerçek Zamanlı Veritabanı Güvenlik Kuralları, JavaScript benzeri ifadelerden oluşur. Bu ifadeler JSON dokümanı. Kurallarınızın yapısı, sakladığınız başka bir alan olacaktır.
Temel kurallar, güvenliği sağlanacak bir düğüm kümesini tanımlar ve erişim yöntemlerini (ör.
Write) ve erişime izin verilen ya da reddedildiği koşulları içerir.
Aşağıdaki örneklerde koşullarımız basit true
olacak ve
false
ifadeleri görebilirsiniz, ancak bir sonraki konuda
ve koşulları ifade eder.
Bu nedenle, örneğin parent_node
altında bir child_node
alanının güvenliğini sağlamaya çalışıyorsak
genel söz dizimi şöyledir:
{ "rules": { "parent_node": { "child_node": { ".read": <condition>, ".write": <condition>, ".validate": <condition>, } } } }
Bu kalıbı uygulayalım. Örneğin, bir listeyi takip ettiğinizi içeren bir e-posta alırsınız ve aşağıdaki gibi veriler içerir:
{ "messages": { "message0": { "content": "Hello", "timestamp": 1405704370369 }, "message1": { "content": "Goodbye", "timestamp": 1405704395231 }, ... } }
Kurallarınız benzer bir şekilde yapılandırılmalıdır. İşte karşınızda bu veri yapısı için mantıklı olabilecek salt okunur güvenlik kurallarını gözden geçiririz. Bu örnek, kuralların geçerli olacağı veritabanı düğümlerini nasıl belirttiğimizi ve koşulları değerlendirmeyi amaçlar.
{ "rules": { // For requests to access the 'messages' node... "messages": { // ...and the individual wildcarded 'message' nodes beneath // (we'll cover wildcarding variables more a bit later).... "$message": { // For each message, allow a read operation if <condition>. In this // case, we specify our condition as "true", so read access is always granted. ".read": "true", // For read-only behavior, we specify that for write operations, our // condition is false. ".write": "false" } } } }
Temel Kural İşlemleri
Türüne göre güvenliği zorunlu kılmak için üç tür kural vardır:
veriler üzerinde gerçekleştirilen işlem: .write
, .read
ve .validate
. Burası
amaçlarının kısa bir özetidir:
Kural Türleri | |
---|---|
okuyun | Verilerin kullanıcılar tarafından okunmasına izin verilip verilmeyeceğini ve ne zaman izin verileceğini tanımlar. |
.yazma | Verilerin yazılmasına izin verilip verilmediğini ve ne zaman yazılabileceğini tanımlar. |
.verify | Doğru biçimlendirilmiş bir değerin veri türünü de içerir. |
Joker Karakter Yakalama Değişkenleri
Tüm kural ifadeleri düğümlere işaret eder. Bir ifade belirli bir fikri işaret edebilir
veya $
joker karakterli yakalama değişkenleri
seviyesidir. Düğümün değerini depolamak için bu yakalama değişkenlerini kullanın
anahtarlarının sayısını artırın. Bu teknik, projenizle ilgili
daha ayrıntılı Rules koşullarını ele alacağız.
göreceğiz.
{ "rules": { "rooms": { // this rule applies to any child of /rooms/, the key for each room id // is stored inside $room_id variable for reference "$room_id": { "topic": { // the room's topic can be changed if the room id has "public" in it ".write": "$room_id.contains('public')" } } } } }
Dinamik $
değişkenleri sabit yolla paralel olarak da kullanılabilir
gösterir. Bu örnekte, şunu bildirmek için $other
değişkenini kullanıyoruz:
bir .validate
kuralı ile birlikte
widget
, title
ve color
dışında bir alt öğeye sahip değil.
Başka alt öğelerin oluşturulmasına neden olacak yazma işlemleri başarısız olur.
{ "rules": { "widget": { // a widget can have a title or color attribute "title": { ".validate": true }, "color": { ".validate": true }, // but no other child paths are allowed // in this case, $other means any key excluding "title" and "color" "$other": { ".validate": false } } } }
Kural Okuma ve Yazma
.read
ve .write
kuralları daha sığ değil, yukarıdan aşağıya doğru çalışır
daha derin kuralları
geçersiz kılar. Bir kural, belirli bir kuralda okuma veya yazma izni veriyorsa
yolunu izler, ayrıca
tüm alt düğümleri tıklayın. Aşağıdaki yapıyı göz önünde bulundurun:
{ "rules": { "foo": { // allows read to /foo/* ".read": "data.child('baz').val() === true", "bar": { /* ignored, since read was allowed already */ ".read": false } } } }
Bu güvenlik yapısı, /bar/
ürününün her zaman okunmasına izin verir.
/foo/
, true
değerine sahip bir alt baz
içeriyor.
/foo/bar/
altındaki ".read": false
kuralında
burada geçerlidir. Çünkü erişim, alt yollar tarafından iptal edilemez.
İlk bakışta kolay gibi görünmese de bu, kural dilinin önemli bir parçasıdır. Ayrıca, oldukça karmaşık erişim ayrıcalıklarının minimum çabayla uygulanmasına olanak tanır. Bu bu kılavuzun sonraki bölümlerinde kullanıcı tabanlı güvenliğe girdiğimizde açıklanacaktır.
.validate
kurallarının basamaklı olmadığını unutmayın. Tüm kuralları doğrula
bir yazmaya izin verilebilmesi için hiyerarşinin tüm düzeylerinde karşılanması gerekir.
Kurallar Filtre Değildir
Kurallar atomik bir şekilde uygulanır. Yani, okuma veya yazma o konumda veya belirli bir konumda kural yoksa, işlem hemen üst konuma taşıyabilirsiniz. Etkilenen her alt yol erişilebilir olsa bile okuma işlemi tamamen başarısız olur. Şu yapıyı göz önünde bulundurun:
{ "rules": { "records": { "rec1": { ".read": true }, "rec2": { ".read": false } } } }
Kuralların atomik olarak değerlendirildiğini anlamadan,
Örneğin, /records/
yolunu getirmek rec1
sonucunu döndürür.
ancak rec2
değil. Ancak asıl sonuç bir hatadır:
JavaScript
var db = firebase.database(); db.ref("records").once("value", function(snap) { // success method is not called }, function(err) { // error callback triggered with PERMISSION_DENIED });
Objective-C
FIRDatabaseReference *ref = [[FIRDatabase database] reference]; [[_ref child:@"records"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // success block is not called } withCancelBlock:^(NSError * _Nonnull error) { // cancel block triggered with PERMISSION_DENIED }];
Swift
var ref = FIRDatabase.database().reference() ref.child("records").observeSingleEventOfType(.Value, withBlock: { snapshot in // success block is not called }, withCancelBlock: { error in // cancel block triggered with PERMISSION_DENIED })
Java
FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("records"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { // success method is not called } @Override public void onCancelled(FirebaseError firebaseError) { // error callback triggered with PERMISSION_DENIED }); });
REST
curl https://docs-examples.firebaseio.com/rest/records/ # response returns a PERMISSION_DENIED error
/records/
üzerindeki okuma işlemi atomik olduğundan
/records/
altındaki tüm verilere erişim izni veren kuralı oku,
bu PERMISSION_DENIED
hatası verir. Bu yeniliğin,
kuralımızda, Firebase konsolumuzdaki güvenlik simülasyon aracında
hiçbir okuma kuralı öğeye erişime izin vermediğinden okuma işlemi reddedildi
/records/
yol. Ancak, rec1
kuralının
istediğimiz yolda olmadığı için hiç değerlendirilmedi. Getirmek için
rec1
, dosyaya doğrudan erişmemiz gerekir:
JavaScript
var db = firebase.database(); db.ref("records/rec1").once("value", function(snap) { // SUCCESS! }, function(err) { // error callback is not called });
Objective-C
FIRDatabaseReference *ref = [[FIRDatabase database] reference]; [[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // SUCCESS! }];
Swift
var ref = FIRDatabase.database().reference() ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in // SUCCESS! })
Java
FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("records/rec1"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { // SUCCESS! } @Override public void onCancelled(FirebaseError firebaseError) { // error callback is not called } });
REST
curl https://docs-examples.firebaseio.com/rest/records/rec1 # SUCCESS!
Çakışan İfadeler
Bir düğüme birden fazla kural uygulanabilir.
birden fazla kural ifadesinin bir düğümü tanımladığı durumlarda erişim yöntemi
koşullardan herhangi birinin false
olması durumunda reddedilir:
{ "rules": { "messages": { // A rule expression that applies to all nodes in the 'messages' node "$message": { ".read": "true", ".write": "true" }, // A second rule expression applying specifically to the 'message1` node "message1": { ".read": "false", ".write": "false" } } } }
Yukarıdaki örnekte, message1
düğümüne yapılan okumalar
ilk kural olmasına rağmen ikinci kural her zaman false
olduğu için reddedildi
kural her zaman true
şeklindedir.
Sonraki adımlar
Firebase Realtime Database Güvenlik Kuralları hakkında daha fazla bilgi edinebilirsiniz:
Rules dilinin bir sonraki ana kavramını, dinamik Rules cihazınızın kullanıcıyı kontrol etmesine olanak tanıyan conditions yetkilendirme, mevcut ve gelen verileri karşılaştırma, gelen verileri doğrulama, kontrol etme istemciden gelen sorguların yapısı ve daha fazlası.
Güvenlikle ilgili tipik kullanım alanlarını ve bunları ele alan Firebase Güvenlik Kuralları tanımlarını inceleyin.