Bu kılavuz, Cloud Storage için Firebase Güvenlik Kurallarınıza nasıl koşul ekleyeceğinizi göstermek üzere Firebase Güvenlik Kuralları dilinin temel söz dizimini öğrenme rehberine dayanmaktadır.
Cloud Storage Güvenlik Kurallarının birincil yapı taşı koşul'dur. Koşul, belirli bir işleme izin verilmesi veya reddedilmesi gerektiğini belirleyen bir boole ifadesidir. Temel kurallarda koşullar çok iyi çalıştığı için true
ve false
değişmez değerlerini kullanmak. Ancak Firebase Security Rules for Cloud Storage dili, aşağıdaki işlemleri gerçekleştirebilecek daha karmaşık koşullar yazmanızı sağlar:
- Kullanıcı kimlik doğrulamasını kontrol edin
- Gelen verileri doğrulayın
Doğrulama
Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage için güçlü kullanıcı tabanlı kimlik doğrulama sağlamak amacıyla Firebase Authentication ile entegre olur. Bu, Firebase Authentication jetonunun taleplerine göre ayrıntılı erişim kontrolü sağlar.
Kimliği doğrulanmış bir kullanıcı Cloud Storage'a karşı bir istek gerçekleştirdiğinde request.auth
değişkeni, kullanıcının uid
(request.auth.uid
) ve Firebase Authentication JWT (request.auth.token
) iddialarıyla doldurulur.
Ayrıca, özel kimlik doğrulama kullanılırken request.auth.token
alanında ek hak talepleri gösterilir.
Kimliği doğrulanmamış bir kullanıcı istek gerçekleştirdiğinde request.auth
değişkeni null
olur.
Bu veriler kullanılarak, dosyaların güvenliğini sağlamak için kimlik doğrulamayı kullanmanın yaygın olarak kullanılan birkaç yolu vardır:
- Herkese açık:
request.auth
adlı kullanıcıyı yoksay - Kimliği gizli:
request.auth
değerininnull
olmadığından emin olun - Kullanıcı gizli:
request.auth.uid
değerininuid
yolu ile aynı olup olmadığını kontrol edin - Grup gizli: Özel jetonun, seçilen bir taleple eşleşme taleplerini kontrol edin veya bir meta veri alanı olup olmadığını görmek için dosya meta verilerini okuyun
Herkese açık
Kullanıcının kimlik doğrulama bağlamını dikkate almadığı için request.auth
bağlamını hesaba katılmayan tüm kurallar public
kuralı olarak kabul edilebilir.
Bu kurallar; oyun öğeleri, ses dosyaları veya diğer statik içerikler gibi herkese açık verilerin gösterilmesi 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"); }
Kimliği doğrulanmış gizli
Belirli durumlarda, verilerin uygulamanızın kimliği doğrulanmış tüm kullanıcıları tarafından görüntülenmesini, ancak kimliği doğrulanmamış kullanıcılar tarafından görüntülenmesini isteyebilirsiniz. request.auth
değişkeni, kimliği doğrulanmamış tüm kullanıcılar için null
olduğundan kimlik doğrulamayı zorunlu kılmak için tek yapmanız gereken request.auth
değişkeninin var olduğunu kontrol etmektir:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
Kullanıcıya gizli
request.auth
için en yaygın kullanım alanı, tek tek kullanıcılara dosyalarıyla ilgili ayrıntılı izinler vermek olacaktır: profil resmi yüklemekten gizli dokümanları okumaya kadar.
Cloud Storage'daki dosyalar, dosyaya giden tam bir"yol" içerdiğinden, bir dosyanın kullanıcı tarafından kontrol edilmesini sağlamak için gereken tek şey, kural değerlendirildiğinde kontrol edilebilen, dosya adı önekindeki (kullanıcının uid
kodu gibi) benzersiz, kullanıcıyı tanımlayan bir bilgidir:
// 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; }
Grubu gizli
Aynı şekilde yaygın olarak kullanılan bir diğer kullanım alanı da birkaç ekip üyesinin paylaşılan bir belge üzerinde ortak çalışmasına olanak tanımak gibi bir nesne üzerinde grup izinlerine izin vermektir. Bunu yapmak için çeşitli yaklaşımlar vardır:
- Grup üyesi hakkında ek bilgiler (grup kimliği gibi) içeren bir Firebase Authentication özel jetonu oluşturun
- Dosya meta verilerine grup bilgilerini (grup kimliği veya yetkili
uid
listesi gibi) ekleyin
Bu verilere jeton veya dosya meta verilerinde depolandıktan sonra bir kural içinden verilere 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 İsteme
Yükleme, indirme, meta veri değişiklikleri ve silme işlemleri, Cloud Storage'a gönderilen request
kullanılarak değerlendirilir. Yukarıda açıklandığı gibi request.auth
nesnesindeki kullanıcının benzersiz kimliği ve Firebase Authentication yüküne ek olarak request
değişkeni, isteğin gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve istek yazma işlemiyse yeni resource
değerini içerir.
request
nesnesi aynı zamanda kullanıcının benzersiz kimliğini ve request.auth
nesnesindeki Firebase Authentication yükünü de içerir. Bu veri, belgelerin Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı bir şekilde açıklanacaktır.
request
nesnesindeki özelliklerin tam listesini aşağıda bulabilirsiniz:
Özellik | Tür | Açıklama |
---|---|---|
auth |
eşleme<dize, dize> | Kullanıcı giriş yaptığında uid adlı kullanıcının benzersiz kimliğini ve Firebase Authentication JWT hak taleplerinin eşlemesini sağlayan token değerini sağlar. Aksi takdirde, null olacaktır. |
params |
eşleme<dize, dize> | İsteğin sorgu parametrelerini içeren eşleme. |
path |
yol | İsteğin gerçekleştirildiği yolu temsil eden bir path . |
resource |
eşleme<dize, dize> | Yeni kaynak değeri (yalnızca write isteklerinde bulunur).
|
time |
zaman damgası | İsteğin değerlendirildiği sunucu zamanını temsil eden zaman damgası. |
Kaynak Değerlendirme
Kuralları değerlendirirken yüklenen, indirilen, değiştirilen veya silinen dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. Bu, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine izin verme veya yalnızca belirli bir boyutun üzerindeki dosyaların silinmesine izin verme gibi işlemler yapan karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.
Cloud Storage için Firebase Güvenlik Kuralları, dosya meta verilerini resource
nesnesinde sağlar. Bu nesne, Cloud Storage nesnesinde bulunan meta verilerin anahtar/değer çiftlerini içerir. Veri bütünlüğünü sağlamak için bu özellikler read
veya write
isteklerinde incelenebilir.
write
isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), istek yolunda mevcut olan dosyanın meta verilerini içeren resource
nesnesine ek olarak, request.resource
nesnesini de kullanabilirsiniz. Bu nesne, yazmaya izin verildiği takdirde yazılacak dosya meta verilerinin bir alt kümesini içerir. Veri bütünlüğünü sağlamak veya dosya türü ya da boyutu gibi uygulama kısıtlamaları uygulamak için bu iki değeri kullanabilirsiniz.
resource
nesnesindeki ö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 oluşturma işlemi. |
metageneration |
int | Bu nesnenin Google Cloud Storage nesne meta oluşturması. |
size |
int | Nesnenin bayt cinsinden boyutu. |
timeCreated |
zaman damgası | Nesnenin oluşturulduğu zamanı temsil eden bir zaman damgası. |
updated |
zaman damgası | Nesnenin en son ne zaman güncellendiğini gösteren bir zaman damgası. |
md5Hash |
dize | Nesnenin MD5 karması. |
crc32c |
dize | Nesnenin crc32c karması. |
etag |
dize | Bu nesneyle ilişkilendirilen etag. |
contentDisposition |
dize | Bu nesneyle ilişkilendirilen içerik yapısı. |
contentEncoding |
dize | Bu nesneyle ilişkilendirilen içerik kodlaması. |
contentLanguage |
dize | Bu nesneyle ilişkilendirilen içerik dili. |
contentType |
dize | Bu nesneyle ilişkilendirilen içerik türü. |
metadata |
eşleme<dize, dize> | 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ştirin
Diğer yetkilendirme ölçütlerini değerlendirmek için Cloud Firestore'daki belgelere erişebilirsiniz.
firestore.get()
ve firestore.exists()
işlevlerini kullanarak güvenlik kurallarınız, gelen istekleri Cloud Firestore'daki belgelerle karşılaştırarak değerlendirebilir.
firestore.get()
ve firestore.exists()
işlevlerinin her ikisi de tam olarak belirtilmiş belge yolları bekler. firestore.get()
ve firestore.exists()
için yollar oluşturmak amacıyla değişkenler kullanırken $(variable)
söz dizimini kullanarak değişkenlerden açıkça çıkmanız gerekir.
Aşağıdaki örnekte, dosyalara okuma erişimini, belirli kulüplerin üyesi olan kullanıcılarla kısıtlayan bir kural gösterilmektedir.
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 kullanıcının 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 Güvenlik Kurallarınızı oluşturup kaydettikten sonra, Firebase konsolunda veya Firebase CLI'da iki ürünü bağlamak için izinleri etkinleştirmeniz istenir.
Bu özelliği, Firebase Güvenlik Kurallarını yönetme ve dağıtma başlıklı makalede açıklandığı şekilde bir IAM rolünü kaldırarak devre dışı bırakabilirsiniz.
Verileri doğrulama
Cloud Storage için Firebase Güvenlik Kuralları, dosya adı ve yolunun yanı sıra contentType
ve size
gibi dosya meta veri özelliklerini doğrulamak 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 Güvenlik Kurallarınız daha karmaşık hale geldikçe, kural grubunuzda yeniden kullanabileceğiniz işlevlerde koşul gruplarını sarmalamak isteyebilirsiniz. Güvenlik kuralları, özel işlevleri destekler. Özel işlevlerin söz dizimi biraz JavaScript'e benzer ancak Firebase Güvenlik Kuralları işlevleri, bazı önemli sınırlamaları olan, alana özgü bir dilde yazılmıştır:
- İşlevler yalnızca tek bir
return
ifadesi içerebilir. Ek mantık içeremez. Örneğin döngüleri yürütemez veya harici hizmetleri çağıramazlar. - İş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'daget()
veexists()
gibi yerleşik işlevlere erişebilir. - İşlevler diğer işlevleri çağırabilir ancak yinelenmeyebilir. Toplam çağrı grubu derinliği 10 ile sınırlıdır.
rules2
sürümünde, işlevlerlet
anahtar kelimesini kullanarak değişkenleri tanımlayabilir. İşlevler herhangi bir sayıda izin bağlamasına sahip olabilir ancak bir dönüş ifadesiyle bitmelidir.
Bir işlev, 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 Güvenlik Kurallarınızdaki işlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça bunları daha sürdürülebilir hale getirir.
Sonraki adımlar
Koşulları ele aldıktan sonra, artık Kurallar'ı daha iyi anlamış oldunuz ve artık:
Temel kullanım alanlarını nasıl ele alacağınızı öğrenin ve Kural geliştirme, test etme ve dağıtma iş akışını öğrenin:
- Sık karşılaşılan senaryolar ile alakalı kurallar yazın.
- Güvenli olmayan kuralları tespit etmeniz ve bunlardan kaçınmanız gereken durumları inceleyerek bilginizi artırın.
- Cloud Storage emülatörünü ve özel Güvenlik Kuralları test kitaplığını kullanarak kuralları test edin.
- Kuralların dağıtımında kullanılabilecek yöntemleri inceleyin.