Catch up on everything we announced at this year's Firebase Summit. Learn more

Gerçek Zamanlı Veritabanı Kuralları dilinin temel sözdizimini öğrenin

Firebase Gerçek Zamanlı Veritabanı Güvenlik Kuralları, veritabanınızda depolanan verilere erişimi kontrol etmenize olanak tanır. Esnek kurallar sözdizimi, veritabanınıza yapılan tüm yazmalardan bağımsız düğümlerdeki işlemlere kadar her şeyle eşleşen kurallar oluşturmanıza olanak tanır.

Gerçek zamanlı Veritabanı Güvenlik Kuralları veritabanınız için bildirim yapılandırma vardır. Bu, kuralların ürün mantığından ayrı olarak tanımlandığı anlamına gelir. Bunun bir takım avantajları vardır: müşteriler güvenliği uygulamaktan sorumlu değildir, hatalı uygulamalar verilerinizi tehlikeye atmaz ve belki de en önemlisi, verileri dünyadan korumak için sunucu gibi bir ara hakeme gerek yoktur.

Bu konu, eksiksiz kural kümeleri oluşturmak için kullanılan Gerçek Zamanlı Veritabanı Güvenlik Kurallarının temel sözdizimini ve yapısını açıklar.

Güvenlik Kurallarınızı Yapılandırma

Gerçek Zamanlı Veritabanı Güvenlik Kuralları, bir JSON belgesinde yer alan JavaScript benzeri ifadelerden oluşur. Kurallarınızın yapısı, veritabanınızda sakladığınız verilerin yapısına uygun olmalıdır.

Temel kurallar, düğümler kümesi güvence altına erişimin izin verilebilir veya reddedilir altında erişimi (örneğin, okuma yazma) katılan yöntemleri ve koşulları belirlemek. Aşağıdaki örneklerde, bizim şartlar basit olacaktır true ve false ifadeler ancak bir sonraki konuda biz koşullarını ifade etmek daha dinamik yollarını ele alacağız.

Biz güvenli çalışıyorsanız Yani, örneğin, child_node bir altında parent_node , takip etmek, genel sözdizimi:

{
  "rules": {
    "parent_node": {
      "child_node": {
        ".read": <condition>,
        ".write": <condition>,
        ".validate": <condition>,
      }
    }
  }
}

Bu kalıbı uygulayalım. Örneğin, bir mesaj listesini takip ettiğinizi ve şuna benzeyen verilere sahip olduğunuzu varsayalım:

{
  "messages": {
    "message0": {
      "content": "Hello",
      "timestamp": 1405704370369
    },
    "message1": {
      "content": "Goodbye",
      "timestamp": 1405704395231
    },
    ...
  }
}

Kurallarınız da benzer şekilde yapılandırılmalıdır. İşte bu veri yapısı için anlamlı olabilecek salt okunur güvenlik için bir dizi kural. Bu örnek, kuralların uygulanacağı veritabanı düğümlerini nasıl belirlediğimizi ve bu düğümlerdeki kuralları değerlendirme koşullarını gösterir.

{
  "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

: Verilere gerçekleştirilen operasyonun türüne göre güvenlik uygulamak için kurallar üç tipi vardır .write , .read ve .validate . İşte amaçlarının kısa bir özeti:

Kural Türleri
.okuman Verilerin kullanıcılar tarafından okunmasına izin verilip verilmediğini ve ne zaman izin verildiğini açıklar.
.yazı yazmak Verilerin yazılmasına izin verilip verilmediğini ve ne zaman izin verildiğini açıklar.
.validate Doğru biçimlendirilmiş bir değerin nasıl görüneceğini, alt özniteliklere sahip olup olmadığını ve veri türünü tanımlar.

Joker Karakter Yakalama Değişkenleri

Tüm kural ifadeleri düğümlere işaret eder. Bir deyim, belirli bir düğüme işaret veya kullanabilir $ hiyerarşi seviyesinde düğüm kümelerine noktasına joker yakalama değişkenleri. Sonraki kural deyimlerinde kullanmak üzere düğüm anahtarlarının değerini depolamak için bu yakalama değişkenlerini kullanın. Bu teknik, biz bir sonraki konuda daha ayrıntılı olarak ele alacağız şey daha karmaşık kurallar koşulları yazmanıza olanak tanır.

{
  "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şkenler de sabit yol adları ile paralel olarak kullanılabilir. Bu örnekte, kullandığınız $other bir ilan değişken .validate kural olmasını sağlar bu widget dışında hiçbir çocuk babasıdır title ve color . Ek alt öğelerin oluşturulmasına neden olacak herhangi bir yazma işlemi 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 }
    }
  }
}

Okuma ve Yazma Kuralları Basamakları

.read ve .write kurallar derin kurallarını geçersiz kılma sığ kuralları ile, üst-aşağı çalışır. Bir kural hibe belirli yolda okumak veya yazma izinleri varsa, o zaman da altındaki tüm alt düğümler erişim sağlar. 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ı sağlar /bar/ zaman okunacak /foo/ çocuk içeren baz değeri ile true . ".read": false altında kural /foo/bar/ erişim çocuk yolunun tarafından iptal edilemez çünkü burada hiçbir etkisi olmaz.

Hemen sezgisel görünmese de, bu, kurallar dilinin güçlü bir parçasıdır ve çok karmaşık erişim ayrıcalıklarının minimum çabayla uygulanmasına olanak tanır. Bu, bu kılavuzun ilerleyen bölümlerinde kullanıcı tabanlı güvenliğe girdiğimizde gösterilecektir.

O Not .validate kurallar basamaklandırılmamalıdır yoktur. Bir yazmaya izin verilebilmesi için tüm doğrulama kurallarının hiyerarşinin tüm seviyelerinde karşılanması gerekir.

Kurallar Filtre Değildir

Kurallar atomik bir şekilde uygulanır. Bu, o konumda veya erişim izni veren bir üst konumda bir kural yoksa, okuma veya yazma işleminin hemen başarısız olduğu anlamına gelir. Etkilenen her alt yola erişilebilir olsa bile, üst konumda okuma tamamen başarısız olur. Bu yapıyı düşünün:

{
  "rules": {
    "records": {
      "rec1": {
        ".read": true
      },
      "rec2": {
        ".read": false
      }
    }
  }
}

Kurallar atomik değerlendirilmesini anlamakta olmadan, alma gibi gözükebilir /records/ dönecekti yolu rec1 ancak rec2 . 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
});
Amaç-C
Not: Bu Firebase ürün App Klip hedefte 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
}];
Süratli
Not: Bu Firebase ürün App Klip hedefte 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
  });
});
DİNLENMEK
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

En okuma işleminden yana /records/ atomik ve altındaki bütün veriye erişim izni verir dair hiçbir okuma kural var /records/ , bu atacağım PERMISSION_DENIED hatası. Bizim güvenlik simülatörde bu kuralı değerlendirmek durumunda Firebase konsolda , hiçbir okuma kuralı erişimine izin çünkü okuma işlemi reddedildi görebiliriz /records/ yolu. Ancak, kural notu o rec1 hiç değerlendirilmemiştir biz istenen yolunda değildi çünkü. Getirilemedi rec1 , doğrudan erişmek gerekir:

JavaScript
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
Amaç-C
Not: Bu Firebase ürün App Klip hedefte kullanılamaz.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
Süratli
Not: Bu Firebase ürün App Klip hedefte 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
  }
});
DİNLENMEK
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

Çakışan İfadeler

Bir düğüme birden fazla kuralın uygulanması mümkündür. Birden fazla kural ifadeleri bir düğümü tanımlamak durumunda, erişim yöntemi koşullardan herhangi olup olmadığını engellendi false :

{
  "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, okur message1 ikinci Kurallar her zaman olduğundan reddedilir düğüm false ilk kural her zaman olmasına rağmen, true .

Sonraki adımlar

Firebase Gerçek Zamanlı Veritabanı Güvenlik Kuralları hakkındaki anlayışınızı derinleştirebilirsiniz:

  • Kurallar dil, dinamik bir sonraki ana konseptini öğrenin koşullar , sizin Kurallar çek kullanıcı yetkilendirme izin varolan ve gelen verileri karşılaştırmak, gelen verileri doğrulamak, istemciden gelen sorguları yapısını kontrol ve daha fazlası.

  • Tipik güvenlik kullanım durumları ve gözden Firebase Güvenlik Kuralları tanımlarını adres onlara o .