Firestore Güvenlik Kurallarını Efektif Şekilde Kullanmak

Firestore, Google Cloud tarafından sunulan ve ölçeklenebilir, esnek bir veritabanı hizmetidir. Güvenli ve kontrollü bir şekilde veri erişimini sağlamak için Firestore, güvenlik kuralları kullanır. Bu makalede, Firestore güvenlik kurallarının ne olduğunu, nasıl çalıştığını ve nasıl efektif olarak yapılandırılabileceğini detaylı bir şekilde ele alacağız.

Firestore Güvenlik Kuralları Nedir?

Firestore güvenlik kuralları, veritabanınıza erişimi ve veritabanındaki verilerin nasıl okunup yazılabileceğini kontrol eden bir kural setidir. Bu kurallar, Firebase Authentication ile entegre çalışarak, kullanıcı kimliğine göre erişim kontrolü sağlar. Ayrıca, verilerin doğruluğunu ve bütünlüğünü korumak için çeşitli koşullar ekleyebilirsiniz. Bu işlemler ile dışarıdan bir müdahale sonucunda bilgilerinizin değiştirilmesini ve çalınmasını önleyebilirsiniz.

Güvenlik Kurallarının Temel Yapısı

Firestore güvenlik kuralları, firestore.rules adlı bir dosyada tanımlanır. Bu dosya, genellikle aşağıdaki gibi bir yapıya sahiptir:

service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}

Bu yapı, service, match, allow anahtar kelimeleri ile oluşturulur.

  • service: Hangi Firebase hizmeti için kurallar yazıldığını belirtir (cloud.firestore).
  • match: Kuralların hangi veri yolları için geçerli olduğunu belirtir.
  • allow: Hangi işlemlere (okuma, yazma vb.) izin verildiğini belirtir.

Erişim Kontrolü

Firestore güvenlik kuralları ile erişim kontrolü yapmak için allow anahtar kelimesini kullanırız. Örneğin, bir koleksiyona yalnızca kimliği doğrulanmış kullanıcıların erişmesine izin vermek için aşağıdaki gibi bir kural yazabiliriz:

service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null;
}
}
}

Bu kural, users koleksiyonundaki belgelere yalnızca kimliği doğrulanmış kullanıcıların erişebileceğini belirtir. Gündelik hayatta kullandığımız bir çok uygulama daha detaylı iş akışına sahip olur bu nedenle yukarıdaki gibi basit bir kural seti ihtiyaçlarımıza tam karşılık veremeyebilir. Bu gibi durumlarda da koşullu erişimler tanımlamamız gerekir.

Koşullu Erişim

Firestore güvenlik kuralları, erişim kontrolünde daha ayrıntılı koşullar belirlememize olanak tanır. Örneğin, bir kullanıcının yalnızca kendi verilerine erişebilmesi için aşağıdaki gibi bir kural yazabiliriz:

service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}

Bu kural, kimliği doğrulanmış bir kullanıcının yalnızca kendi userId ile eşleşen belgelerine erişmesine izin verir. Bazı durumlarda yazmak istediğimiz dökümanın içerisindeki alanları kontrol etmek isteyebiliriz. Bir e-ticaret uygulaması yaptığınızı varsayalım. Yüklenecek ürünün fiyatının 0 veya altında olmasını istemeyiz. Bu gibi durumlarda da veri doğrulama ile bu işlemi yapabilirsiniz.

Veri Doğrulama

Firestore güvenlik kuralları, verilerin doğruluğunu sağlamak için de kullanılabilir. Örneğin, bir belgedeki belirli bir alanın belirli bir koşulu sağlamasını zorunlu kılabiliriz:

service cloud.firestore {
match /databases/{database}/documents {
match /products/{productId} {
allow create: if request.resource.data.price > 0;
allow update: if request.resource.data.price > 0;
}
}
}

Bu kural, products koleksiyonundaki belgelerin price alanının her zaman 0’dan büyük olmasını zorunlu kılar. Çok daha detaylı ve karmaşık işlemler için kurallar içerisine function tanımlayabiliriz. Birden fazla veya bağımlılık içeren koşulları tek fonksiyon ile kontrol edebiliriz.

Temel Fonksiyon Tanımlama

Bir işlev tanımlamak için function anahtar kelimesini kullanırız. İşlev, bir veya daha fazla parametre alabilir ve bir değer döndürebilir.

service cloud.firestore {
match /databases/{database}/documents {

// Kullanıcı kimliğini doğrulayan bir işlev tanımlama
function isAuthenticated() {
return request.auth != null;
}

// Kullanıcının kendi belgesine erişimini doğrulayan bir işlev tanımlama
function isUserDocument(userId) {
return request.auth.uid == userId;
}

match /users/{userId} {
// İşlevleri kullanarak erişim kontrolü
allow read, write: if isAuthenticated() && isUserDocument(userId);
}
}
}

Bu örnekte, isAuthenticated işlevi kullanıcının kimliğinin doğrulanıp doğrulanmadığını kontrol ederken, isUserDocument işlevi kullanıcının yalnızca kendi belgesine erişip erişemeyeceğini kontrol eder.

Karmaşık Mantık İçin Fonksiyonlar

Daha karmaşık mantık gerektiren durumlar için işlevleri kullanarak kuralları daha yönetilebilir hale getirebilirsiniz. Örneğin, bir kullanıcının bir belgenin sahibi olup olmadığını ve belgedeki belirli alanların doğru değerlere sahip olup olmadığını kontrol eden bir işlev yazabiliriz:

service cloud.firestore {
match /databases/{database}/documents {

// Kullanıcının belge sahibi olup olmadığını kontrol eden işlev
function isOwner(doc) {
return request.auth != null && request.auth.uid == doc.data.ownerId;
}

// Belgedeki fiyatın geçerli olup olmadığını kontrol eden işlev
function isValidPrice(price) {
return price > 0;
}

match /products/{productId} {
// Ürün belgelerine erişim kontrolü
allow create, update: if isOwner(request.resource) && isValidPrice(request.resource.data.price);
allow read: if true; // Herkesin okumasına izin ver
}
}
}

Bu örnekte, isOwner işlevi bir belgenin sahibini doğrularken, isValidPrice işlevi fiyatın pozitif bir değer olup olmadığını kontrol eder. Bu işlevler, products koleksiyonundaki belgelere erişimi kontrol etmek için kullanılır.

Fonksiyonlarla Koşullu Erişim

İşlevleri kullanarak belirli koşullara dayalı erişim kontrolü yapabilirsiniz. Örneğin, bir kullanıcının yalnızca belirli bir rolü varsa belirli işlemleri yapmasına izin vermek için bir işlev yazabiliriz:

service cloud.firestore {
match /databases/{database}/documents {

// Kullanıcının belirli bir role sahip olup olmadığını kontrol eden işlev
function hasRole(role) {
return request.auth != null && request.auth.token.role == role;
}

match /adminData/{document=**} {
// Yalnızca admin rolüne sahip kullanıcıların erişimine izin ver
allow read, write: if hasRole('admin');
}

match /userData/{userId} {
// Kendi verilerine erişim için doğrulama
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}

Bu örnekte, hasRole işlevi kullanıcının belirli bir role sahip olup olmadığını kontrol eder. adminData koleksiyonuna yalnızca admin rolüne sahip kullanıcıların erişmesine izin verilirken, userData koleksiyonunda kullanıcıların yalnızca kendi verilerine erişmesine izin verilir.

Fonksiyonlarla Veri Doğrulama

Veri doğrulama işlemlerini işlevler ile yaparak kuralları daha modüler hale getirebilirsiniz. Örneğin, bir belgedeki tarih alanının geçerli bir tarih olup olmadığını kontrol eden bir işlev yazabiliriz:

service cloud.firestore {
match /databases/{database}/documents {

// Tarihin geçerli olup olmadığını kontrol eden işlev
function isValidDate(date) {
return date > timestamp.date(2000, 1, 1) && date < timestamp.now();
}

match /events/{eventId} {
// Etkinlik belgelerine erişim kontrolü
allow create, update: if isValidDate(request.resource.data.eventDate);
allow read: if true; // Herkesin okumasına izin ver
}
}
}

Bu örnekte, isValidDate işlevi bir tarihin 1 Ocak 2000’den sonra ve şu anki tarihten önce olup olmadığını kontrol eder. events koleksiyonundaki belgelerin oluşturulması ve güncellenmesi sırasında bu işlev kullanılır.

Güvenlik Kurallarının Test Edilmesi

Güvenlik kurallarını test etmek, kuralların beklediğiniz gibi çalıştığından emin olmanın önemli bir parçasıdır. Firebase, güvenlik kurallarını test etmek için kullanabileceğiniz bir simülasyon aracı sağlar. Ayrıca, Firebase Emulator Suite kullanarak yerel ortamınızda kuralları test edebilirsiniz.

Sonuç

Firestore güvenlik kuralları, veritabanınıza erişimi kontrol etmek ve verilerin bütünlüğünü korumak için güçlü bir araçtır. Bu makalede, temel yapısını, erişim kontrolünü, koşullu erişimi ve veri doğrulamasını ele aldık. Güvenlik kurallarını doğru bir şekilde yapılandırmak, uygulamanızın güvenliğini ve kullanıcı verilerinin korunmasını sağlamak için kritik öneme sahiptir.

Güvenlik kurallarını yazarken ve test ederken dikkatli olmanız ve her zaman en iyi güvenlik uygulamalarını takip etmeniz önemlidir.

Not: Bu yazının yazılma aşamasında yapay zekadan destek alındı.


Leave a Reply

Your email address will not be published. Required fields are marked *