Veri doğrulama

Mevcut verilere dayalı olarak yeni veriler yazmak için Firebase Security Rules kullanabilirsiniz inceleyebilirsiniz. Ayrıca, Google Etiket Yöneticisi'ni kullanarak Böylece, yazılan yeni verilere göre yazma işlemlerini kısıtlayarak doğrulamalar yapabilirsiniz. Okumaya devam edin inceleyin.

Veri doğrulama kuralları hakkında daha fazla bilgi edinmek için her bölümden bir ürün seçin.

Yeni verilerle ilgili kısıtlamalar

Cloud Firestore

Belirli bir alan içeren bir dokümanın belirli bir oluşturulmuşsa alanı allow koşuluna ekleyebilirsiniz. Örneğin, ranking alanını içeren dokümanların oluşturulmasını reddetmek istiyorsanız, create koşulunda izin verilmez.

  service cloud.firestore {
    match /databases/{database}/documents {
      // Disallow
      match /cities/{city} {
        allow create: if !("ranking" in request.resource.data)
      }
    }
  }

Realtime Database

Belirli değerleri içeren verilerin eklenmediğinden emin olmak istiyorsanız eklemek istiyorsanız, bu değeri kurallarınıza ekler ve yazar. Örneğin, ranking içeren yazmaları reddetmek isterseniz değerleri söz konusu olduğunda, ranking değerlerine sahip dokümanlar için yazma işlemlerine izin verilmez.

  {
    "rules": {
      // Write is allowed for all paths
      ".write": true,
      // Allows writes only if new data doesn't include a `ranking` child value
      ".validate": "!newData.hasChild('ranking')
    }
  }

Cloud Storage

Belirli meta verileri içeren bir dosyanın dosyamda yer almaması meta verileri allow koşuluna ekleyebilirsiniz. Örneğin, ranking meta verisi içeren dosyaların oluşturulmasını reddetmek istiyorsunuz. create koşulunda izin verilmez.

  service firebase.storage {
    match /b/{bucket}/o {
      match /files/{allFiles=**} {
      // Disallow
        allow create: if !("ranking" in request.resource.metadata)
      }
    }
  }

Firebase Security Rules uygulamasındaki mevcut verileri kullan

Cloud Firestore

Birçok uygulama, erişim denetimi bilgilerini veritabanındaki dokümanlarda alanlar olarak depolar. Cloud Firestore Security Rules dokümana göre erişime dinamik olarak izin verebilir veya erişimi reddedebilir veri:

  service cloud.firestore {
    match /databases/{database}/documents {
      // Allow the user to read data if the document has the 'visibility'
      // field set to 'public'
      match /cities/{city} {
        allow read: if resource.data.visibility == 'public';
      }
    }
  }

resource değişkeni istenen dokümana işaret eder ve resource.data değişkeni belgede depolanan tüm alanların ve değerlerin bir haritası. Daha fazla resource değişkeni hakkında daha fazla bilgi için referansa dokümanlarına göz atın.

Veri yazarken gelen verileri mevcut verilerle karşılaştırmak isteyebilirsiniz. Bu bir alanın değişmediğinden veya yalnızca veya yeni değerin en az bir hafta sonrası olduğunu belirten bir değer girilmelidir. Bu durumda, kural kümeniz bekleyen yazmaya izin veriyorsa request.resource değişkeni dokümanın gelecekteki durumunu içerir. Yalnızca şu özelliklere sahip update işlemleri için: bir alt kümeyi değiştirmek istediğinizde request.resource değişkeni işlemden sonraki beklemedeki doküman durumunu içermelidir. Alanı kontrol edebilirsiniz. değerleri request.resource içinde ayarlayarak istenmeyen veya tutarsız veri güncellemelerini önleyin:

   service cloud.firestore {
     match /databases/{database}/documents {
      // Make sure all cities have a positive population and
      // the name is not changed
      match /cities/{city} {
        allow update: if request.resource.data.population > 0
                      && request.resource.data.name == resource.data.name;
      }
    }
  }

Realtime Database

Realtime Database ürününde, veri yapılarını uygulamak ve doğrulamak için .validate kurallarını kullanın veriler yer alır. Rules, şundan sonra .validate kural çalıştırdı: bir .write kuralının erişim izni verdiğini doğrulayarak

.validate kuralları basamaklamaz. Herhangi bir doğrulama kuralının yolunu veya alt yolunu içeriyorsa yazma işleminin tamamı reddedilir. Ayrıca, doğrulama tanımları yalnızca null olmayan değerleri kontrol eder ve ve ardından verileri silen istekleri yoksayar.

Aşağıdaki .validate kurallarını göz önünde bulundurun:

  {
    "rules": {
      // write is allowed for all paths
      ".write": true,
      "widget": {
        // a valid widget must have attributes "color" and "size"
        // allows deleting widgets (since .validate is not applied to delete rules)
        ".validate": "newData.hasChildren(['color', 'size'])",
        "size": {
          // the value of "size" must be a number between 0 and 99
          ".validate": "newData.isNumber() &&
                        newData.val() >= 0 &&
                        newData.val() <= 99"
        },
        "color": {
          // the value of "color" must exist as a key in our mythical
          // /valid_colors/ index
          ".validate": "root.child('valid_colors/' + newData.val()).exists()"
        }
      }
    }
  }

Yukarıdaki kurallara sahip bir veritabanına yazma istekleri aşağıdaki gibi olur: sonuç:

JavaScript
var ref = db.ref("/widget");

// PERMISSION_DENIED: does not have children color and size
ref.set('foo');

// PERMISSION DENIED: does not have child color
ref.set({size: 22});

// PERMISSION_DENIED: size is not a number
ref.set({ size: 'foo', color: 'red' });

// SUCCESS (assuming 'blue' appears in our colors list)
ref.set({ size: 21, color: 'blue'});

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child('size').set(99);
Objective-C
Not: Bu Firebase ürünü, App Clip hedefinde kullanılamaz.
FIRDatabaseReference *ref = [[[FIRDatabase database] reference] child: @"widget"];

// PERMISSION_DENIED: does not have children color and size
[ref setValue: @"foo"];

// PERMISSION DENIED: does not have child color
[ref setValue: @{ @"size": @"foo" }];

// PERMISSION_DENIED: size is not a number
[ref setValue: @{ @"size": @"foo", @"color": @"red" }];

// SUCCESS (assuming 'blue' appears in our colors list)
[ref setValue: @{ @"size": @21, @"color": @"blue" }];

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
[[ref child:@"size"] setValue: @99];
Swift
Not: Bu Firebase ürünü, App Clip hedefinde kullanılamaz.
var ref = FIRDatabase.database().reference().child("widget")

// PERMISSION_DENIED: does not have children color and size
ref.setValue("foo")

// PERMISSION DENIED: does not have child color
ref.setValue(["size": "foo"])

// PERMISSION_DENIED: size is not a number
ref.setValue(["size": "foo", "color": "red"])

// SUCCESS (assuming 'blue' appears in our colors list)
ref.setValue(["size": 21, "color": "blue"])

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child("size").setValue(99);
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("widget");

// PERMISSION_DENIED: does not have children color and size
ref.setValue("foo");

// PERMISSION DENIED: does not have child color
ref.child("size").setValue(22);

// PERMISSION_DENIED: size is not a number
Map<String,Object> map = new HashMap<String, Object>();
map.put("size","foo");
map.put("color","red");
ref.setValue(map);

// SUCCESS (assuming 'blue' appears in our colors list)
map = new HashMap<String, Object>();
map.put("size", 21);
map.put("color","blue");
ref.setValue(map);

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child("size").setValue(99);
REST
# PERMISSION_DENIED: does not have children color and size
curl -X PUT -d 'foo' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# PERMISSION DENIED: does not have child color
curl -X PUT -d '{"size": 22}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# PERMISSION_DENIED: size is not a number
curl -X PUT -d '{"size": "foo", "color": "red"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# SUCCESS (assuming 'blue' appears in our colors list)
curl -X PUT -d '{"size": 21, "color": "blue"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# If the record already exists and has a color, this will
# succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
# will fail to validate
curl -X PUT -d '99' \
https://docs-examples.firebaseio.com/rest/securing-data/example/size.json

Cloud Storage

Kuralları değerlendirirken dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. yükleme, indirme, değiştirme veya silme işlemlerini yapabilir. Bu sayede kendi başınıza belirli dosyalara izin vermek gibi işlemler için karmaşık ve güçlü veya yalnızca yüklenecek belirli bir boyutun üzerindeki dosyalar silindi.

resource nesnesi, Cloud Storage nesne algılandı. Bu özellikler read veya Veri bütünlüğünü sağlamak için write istekleri. resource nesnesi, meta verileri kontrol eder (Cloud Storage paketinizdeki mevcut dosyalarda)

  service firebase.storage {
    match /b/{bucket}/o {
      match /images {
        match /{allImages=**} {
          // Allow reads if a custom 'visibility' field is set to 'public'
          allow read: if resource.metadata.visibility == 'public';
        }
      }
    }
  }

request.resource nesnesini write isteklerinde de kullanabilirsiniz (örneğin, meta veri güncellemeleri ve silme işlemleri gibi. request.resource nesnesi, write öğesine izin verilirse yazılacak dosyadaki meta verileri içerir.

İstenmeyen veya tutarsız güncellemeleri önlemek için bu iki değeri kullanabilirsiniz. veya dosya türü ya da boyutu gibi uygulama kısıtlamalarını zorunlu kılabilirsiniz.

  service firebase.storage {
    match /b/{bucket}/o {
      match /images {
        // Cascade read to any image type at any path
        match /{allImages=**} {
          allow read;
        }

        // Allow write files to the path "images/*", subject to the constraints:
        // 1) File is less than 5MB
        // 2) Content type is an image
        // 3) Uploaded content type matches existing content type
        // 4) File name (stored in imageId wildcard variable) is less than 32 characters
        match /{imageId} {
          allow write: if request.resource.size < 5 * 1024 * 1024
                       && request.resource.contentType.matches('image/.*')
                       && request.resource.contentType == resource.contentType
                       && imageId.size() < 32
        }
      }
    }
  }

resource nesnesindeki özelliklerin tam listesi : referans belgeleri.