Bu kılavuzda, Cloud Storage için Firebase Security Rules'inize nasıl koşul ekleyeceğiniz gösterilmektedir. Bu bilgiler, Firebase Security Rules dilinin temel söz dizimini öğrenme kılavuzundan alınmıştır.
Cloud Storage Security Rules'ün birincil yapı taşı koşuldur. Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. Temel kurallarda, koşullar olarak true
ve false
değişmezlerini kullanmak mükemmel şekilde çalışır. Ancak Cloud Storage için Firebase Security Rules dili, daha karmaşık koşullar yazmanızı sağlar. Bu koşullar:
- Kullanıcı kimlik doğrulamasını kontrol etme
- Gelen verileri doğrulama
Doğrulama
Cloud Storage için Firebase Security Rules, Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulama sağlamak için Firebase Authentication ile entegre olur. Bu, Firebase Authentication jetonunun iddialarına dayalı ayrıntılı erişim denetimi sağlar.
Kimliği doğrulanmış bir kullanıcı Cloud Storage adresine istek gönderdiğinde request.auth
değişkeni, kullanıcının uid
(request.auth.uid
) değerinin yanı sıra Firebase Authentication JWT'sinin (request.auth.token
) iddialarıyla doldurulur.
Ayrıca, özel kimlik doğrulama kullanılırken request.auth.token
alanında ek iddialar gösterilir.
Kimliği doğrulanmamış bir kullanıcı istek gönderdiğinde request.auth
değişkeni null
olur.
Bu verileri kullanarak, dosyaları güvence altına almak için kimlik doğrulamayı kullanmanın birkaç yaygın yolu vardır:
- Herkese açık: yoksay
request.auth
- Kimliği doğrulanmış gizli:
request.auth
değerininnull
olmadığını kontrol edin - Kullanıcıya özel:
request.auth.uid
değerinin bir yoluid
değerine eşit olup olmadığını kontrol edin - Grup gizli: Özel jetonun iddialarını, seçilen bir iddiayla eşleşip eşleşmediğini kontrol edin veya meta veri alanının olup olmadığını görmek için dosya meta verilerini okuyun
Herkese açık
request.auth
bağlamını dikkate almayan tüm kurallar, kullanıcının kimlik doğrulama bağlamını dikkate almadığı için public
kuralı olarak kabul edilebilir.
Bu kurallar, oyun öğeleri, ses dosyaları veya diğer statik içerikler gibi herkese açık verileri göstermek için yararlı olabilir.
// Anyone to read a public image if the file is less than 100kB // Anyone can upload a public file ending in '.txt' match /public/{imageId} { allow read: if resource.size < 100 * 1024; allow write: if imageId.matches(".*\\.txt"); }
Kimlik doğrulaması yapılmış gizli
Belirli durumlarda, verilerin kimliği doğrulanmamış kullanıcılar tarafından değil, uygulamanızın kimliği doğrulanmış tüm kullanıcıları tarafından görüntülenebilmesini isteyebilirsiniz. Kimliği doğrulanmamış tüm kullanıcılar için request.auth
değişkeni null
olduğundan, kimlik doğrulamayı zorunlu kılmak için tek yapmanız gereken request.auth
değişkeninin var olup olmadığını kontrol etmektir:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
Kullanıcıya özel
request.auth
için en yaygın kullanım alanı, bireysel kullanıcılara dosyalarında ayrıntılı izinler (ör. profil resimleri yükleme ve gizli dokümanları okuma) sağlamaktır.
Cloud Storage içindeki dosyaların tam bir "yolu" olduğundan, bir dosyanın kullanıcı tarafından kontrol edilmesi için gereken tek şey, dosya adı ön ekinde bulunan benzersiz, kullanıcıyı tanımlayan bir bilgidir (kullanıcı uid
gibi). Bu bilgi, kural değerlendirilirken kontrol edilebilir:
// Only a user can upload their profile picture, but anyone can view it match /users/{userId}/profilePicture.png { allow read; allow write: if request.auth.uid == userId; }
Grup gizli
Yine yaygın bir kullanım alanı, bir nesnede grup izinlerine izin vermektir (ör. birkaç ekip üyesinin paylaşılan bir dokümanda ortak çalışmasına izin verme). Bunu yapmanın birkaç yolu vardır:
- Grup üyeleriyle ilgili ek bilgileri (ör. grup kimliği) içeren bir Firebase Authentication özel jeton oluşturma
- Grup bilgilerini (ör. grup kimliği veya yetkili
uid
'lerin listesi) dosya meta verilerine ekleyin.
Bu veriler jetonda veya dosya meta verilerinde depolandıktan sonra bir kuraldan referans verilebilir:
// Allow reads if the group ID in your token matches the file metadata's `owner` property // Allow writes if the group ID is in the user's custom token match /files/{groupId}/{fileName} { allow read: if resource.metadata.owner == request.auth.token.groupId; allow write: if request.auth.token.groupId == groupId; }
Değerlendirme İste
Yüklemeler, indirmeler, meta veri değişiklikleri ve silme işlemleri, Cloud Storage adresine gönderilen request
kullanılarak değerlendirilir. request
değişkeni, kullanıcının benzersiz kimliğine ve yukarıda açıklandığı gibi request.auth
nesnesinde bulunan Firebase Authentication yüküne ek olarak, isteğin gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve istek bir yazma işlemiyse yeni resource
değerini içerir.
request
nesnesi, kullanıcının benzersiz kimliğini ve request.auth
nesnesinde Firebase Authentication yükü de içerir. Bu konu, dokümanların Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanmaktadır.
request
nesnesinde bulunan özelliklerin tam listesini aşağıda bulabilirsiniz:
Özellik | Tür | Açıklama |
---|---|---|
auth |
map<string, string> | Kullanıcı oturum açtığında uid (kullanıcıya ait benzersiz kimlik) ve token (Firebase Authentication JWT iddialarının haritası) sağlar. Aksi takdirde null olur. |
params |
map<string, string> | İsteğin sorgu parametrelerini içeren harita. |
path |
yol | İsteğin yapıldığı yolu temsil eden bir path . |
resource |
map<string, string> | Yalnızca write isteklerinde bulunan yeni kaynak değeri.
|
time |
zaman damgası | İsteğin değerlendirildiği sunucu zamanını temsil eden bir zaman damgası. |
Kaynak Değerlendirmesi
Kuralları değerlendirirken yüklenen, indirilen, değiştirilen veya silinen dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. Bu sayede, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin verme gibi işlemleri yapan karmaşık ve güçlü kurallar oluşturabilirsiniz.
Cloud Storage için Firebase Security Rules, resource
nesnesinde dosya meta verilerini sağlar. Bu nesne, Cloud Storage nesnesinde gösterilen meta verilerin anahtar/değer çiftlerini içerir. Bu özellikler, veri bütünlüğünü sağlamak için read
veya write
isteklerinde denetlenebilmektedir.
write
isteklerinde (yükleme, meta veri güncelleme ve silme gibi), istek yolunda mevcut olan dosyanın meta verilerini içeren resource
nesnesine ek olarak, yazma işlemine izin verilirse yazılacak dosya meta verilerinin bir alt kümesini içeren request.resource
nesnesini de kullanabilirsiniz. Veri bütünlüğünü sağlamak veya dosya türü ya da boyut gibi uygulama kısıtlamalarını uygulamak için bu iki değeri kullanabilirsiniz.
resource
nesnesinde bulunan özelliklerin tam listesini aşağıda bulabilirsiniz:
Özellik | Tür | Açıklama |
---|---|---|
name |
dize | Nesnenin tam adı |
bucket |
dize | Bu nesnenin bulunduğu paketin adı. |
generation |
int | Bu nesnenin Google Cloud Storage nesne nesli. |
metageneration |
int | Bu nesnenin Google Cloud Storage nesne meta oluşturma işlemi. |
size |
int | Nesnenin bayt cinsinden boyutu. |
timeCreated |
zaman damgası | Bir nesnenin oluşturulduğu zamanı gösteren zaman damgası. |
updated |
zaman damgası | Bir nesnenin en son güncellendiği zamanı gösteren zaman damgası. |
md5Hash |
dize | Nesnenin MD5 karma değeri. |
crc32c |
dize | Nesnenin crc32c karması. |
etag |
dize | Bu nesneyle ilişkili etag. |
contentDisposition |
dize | Bu nesneyle ilişkili içerik gönderme. |
contentEncoding |
dize | Bu nesneyle ilişkili içerik kodlaması. |
contentLanguage |
dize | Bu nesneyle ilişkili içerik dili. |
contentType |
dize | Bu nesneyle ilişkili içerik türü. |
metadata |
map<string, string> | Geliştirici tarafından belirtilen ek özel meta verilerin anahtar/değer çiftleri. |
request.resource
, generation
, metageneration
, etag
, timeCreated
ve updated
hariç bunların tümünü içerir.
Cloud Firestore ile geliştirme
Diğer yetkilendirme ölçütlerini değerlendirmek için Cloud Firestore'teki belgelere erişebilirsiniz.
Güvenlik kurallarınızda firestore.get()
ve firestore.exists()
işlevlerini kullanarak gelen istekleri Cloud Firestore içindeki dokümanlarla karşılaştırabilirsiniz.
Hem firestore.get()
hem de firestore.exists()
işlevleri, tamamen belirtilen belge yolları bekler. firestore.get()
ve firestore.exists()
için yollar oluşturmak üzere değişkenler kullanırken $(variable)
söz dizimini kullanarak değişkenlerden açıkça kaçmanız gerekir.
Aşağıdaki örnekte, dosyalara okuma erişimini belirli kulüplerin üyeleriyle kısıtlayan bir kural görüyoruz.
service firebase.storage { match /b/{bucket}/o { match /users/{club}/files/{fileId} { allow read: if club in firestore.get(/databases/(default)/documents/users/$(request.auth.id)).memberships } } }Sonraki örnekte, kullanıcının fotoğraflarını yalnızca arkadaşları görebilir.
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/photos/{fileId} { allow read: if firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id)) } } }
Bu Cloud Firestore işlevlerini kullanan ilk Cloud Storage Security Rules'inizi oluşturup kaydettikten sonra, Firebase konsolunda veya Firebase CLI'sinde iki ürünü bağlama izinlerini etkinleştirmeniz istenir.
Firebase Security Rules'i yönetme ve dağıtma bölümünde açıklandığı gibi bir IAM rolünü kaldırarak bu özelliği devre dışı bırakabilirsiniz.
Verileri doğrulama
Cloud Storage için Firebase Security Rules, dosya adının ve yolunun yanı sıra contentType
ve size
gibi dosya meta veri özelliklerinin doğrulanması da dahil olmak üzere veri doğrulama için de kullanılabilir.
service firebase.storage { match /b/{bucket}/o { match /images/{imageId} { // Only allow uploads of any image file that's less than 5MB allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*'); } } }
Özel işlevler
Firebase Security Rules'ünüz daha karmaşık hale geldikçe koşul gruplarını kural kümenizde yeniden kullanabileceğiniz işlevlere sarmalamak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin söz dizimi JavaScript'e biraz benzer ancak Firebase Security Rules işlevleri, bazı önemli sınırlamaları olan alana özgü bir dilde yazılır:
- İşlevler yalnızca tek bir
return
ifadesi içerebilir. Bu işlevler ek mantık içeremez. Örneğin, döngü yürütemez veya harici hizmetleri çağıramaz. - İşlevler, tanımlandıkları kapsamdaki işlevlere ve değişkenlere otomatik olarak erişebilir. Örneğin,
service firebase.storage
kapsamında tanımlanan bir işlev,resource
değişkenine ve yalnızca Cloud Firestore içinget()
veexists()
gibi yerleşik işlevlere erişebilir. - İşlevler diğer işlevleri çağırabilir ancak yineleme yapamaz. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
rules2
sürümünde işlevler,let
anahtar kelimesini kullanarak değişkenler tanımlayabilir. İşlevler herhangi bir sayıda let bağlaması içerebilir ancak return ifadesiyle bitmelidir.
İşlevler function
anahtar kelimesiyle tanımlanır ve sıfır veya daha fazla bağımsız değişken alır. Örneğin, yukarıdaki örneklerde kullanılan iki koşul türünü tek bir işlevde birleştirmek isteyebilirsiniz:
service firebase.storage {
match /b/{bucket}/o {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /images/{imageId} {
allow read, write: if signedInOrPublic();
}
match /mp3s/{mp3Ids} {
allow read: if signedInOrPublic();
}
}
}
Firebase Security Rules'ünüzde işlevler kullandığınızda, kurallarınızın karmaşıklığı arttıkça bu kuralları daha kolay yönetebilirsiniz.
Sonraki adımlar
Koşullarla ilgili bu tartışmadan sonra kurallar hakkında daha ayrıntılı bilgi sahibi oldunuz ve şunları yapmaya hazırsınız:
Temel kullanım alanlarını nasıl yöneteceğinizi ve kuralları geliştirme, test etme ve dağıtma iş akışını öğrenin:
- Sık karşılaşılan senaryoları ele alan kurallar yazın.
- Güvenli olmayan kuralları tespit edip önlemeniz gereken durumları inceleyerek bilginizi geliştirin.
- Cloud Storage emülatörünü ve özel Güvenlik Kuralları test kitaplığını kullanarak kuralları test edin.
- Rules'yi dağıtmak için kullanılabilen yöntemleri inceleyin.