Realtime Database Güvenlik Kuralları dilinin temel söz dizimini öğrenin

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
Not: Bu Firebase ürünü, App Clip hedefinde kullanılamaz.
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
Not: Bu Firebase ürünü, App Clip hedefinde kullanılamaz.
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
Not: Bu Firebase ürünü, App Clip hedefinde kullanılamaz.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
Swift
Not: Bu Firebase ürünü, App Clip hedefinde kullanılamaz.
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.