Bu kılavuz, Bulut Depolama için Firebase Güvenlik Kurallarınıza nasıl koşul ekleyeceğinizi göstermek üzere Firebase Güvenlik Kuralları dil kılavuzunun temel sözdizimini öğrenmeyi temel alır.
Bulut Depolama Güvenlik Kurallarının birincil yapı taşı koşuldur . Koşul, belirli bir işleme izin verilmesi veya reddedilmesi gerektiğini belirleyen bir boole ifadesidir. Temel kurallar için, true
ve false
değerlerin koşul olarak kullanılması gayet iyi sonuç verir. Ancak Cloud Storage için Firebase Güvenlik Kuralları dili size aşağıdakileri yapabilecek daha karmaşık koşullar yazmanın yollarını sunar:
- Kullanıcı kimlik doğrulamasını kontrol edin
- Gelen verileri doğrula
Kimlik doğrulama
Cloud Storage için Firebase Güvenlik Kuralları, Firebase Authentication ile entegre olarak Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulama sağlar. Bu, Firebase Authentication jetonunun taleplerine dayalı olarak ayrıntılı erişim kontrolüne olanak tanır.
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 kullanıcı uid
( request.auth.uid
) yanı sıra Firebase Kimlik Doğrulama JWT'nin ( request.auth.token
) talepleriyle doldurulur.
Ayrıca, özel kimlik doğrulama kullanıldığında request.auth.token
alanında ek talepler ortaya çıkar.
Kimliği doğrulanmamış bir kullanıcı bir istek gerçekleştirdiğinde request.auth
değişkeni null
olur.
Bu verileri kullanarak, dosyaların güvenliğini sağlamak için kimlik doğrulamayı kullanmanın birkaç yaygın yolu vardır:
- Herkese açık:
request.auth
yoksay - Kimliği doğrulanmış özel:
request.auth
null
olup olmadığını kontrol edin - Kullanıcı özel:
request.auth.uid
bir yoluid
kimliğine eşit olup olmadığını kontrol edin - Grup özel: seçilen bir taleple eşleşecek şekilde özel belirtecin taleplerini kontrol edin veya bir meta veri alanının mevcut olup olmadığını görmek için dosya meta verilerini okuyun
Halk
request.auth
bağlamını dikkate almayan herhangi bir kural, kullanıcının kimlik doğrulama bağlamını dikkate almadığından public
kural olarak kabul edilebilir. Bu kurallar, oyun varlıkları, ses dosyaları veya diğer statik içerikler gibi genel verilerin ortaya çıkarılmasında 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ış özel
Bazı durumlarda, verilerin uygulamanızın kimliği doğrulanmış tüm kullanıcıları tarafından görüntülenebilmesini, ancak kimliği doğrulanmamış kullanıcılar tarafından görüntülenememesini isteyebilirsiniz. request.auth
değişkeni kimliği doğrulanmamış tüm kullanıcılar için null
olduğundan, kimlik doğrulama gerektirmek için yapmanız gereken tek şey 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ı özel
request.auth
bugüne kadarki en yaygın kullanım durumu, bireysel kullanıcılara dosyaları üzerinde ayrıntılı izinler sağlamak olacaktır: profil resimleri yüklemekten özel belgeleri okumaya kadar.
Cloud Storage'daki dosyaların dosyaya giden tam bir "yolu" olduğundan, bir dosyanın kullanıcı tarafından kontrol edilmesi için tek gereken, dosya adı önekinde (kullanıcının kullanıcı uid
gibi) kontrol edilebilecek benzersiz, kullanıcıyı tanımlayan bir bilgi parçasıdır. kural değerlendirildiğinde:
// 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 özel
Aynı derecede yaygın olan bir başka kullanım durumu da, birkaç ekip üyesinin paylaşılan bir belge üzerinde işbirliği yapmasına izin vermek gibi bir nesne üzerinde grup izinlerine izin vermek olacaktır. Bunu yapmanın birkaç yaklaşımı vardır:
- Bir 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 veriler belirteçte veya dosya meta verilerinde depolandıktan sonra, bu verilere bir kural içinden başvurulabilir:
// 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'a gönderilen request
kullanılarak değerlendirilir. Yukarıda açıklandığı gibi request.auth
nesnesindeki kullanıcının benzersiz kimliğine ve Firebase Authentication verisine ek olarak request
değişkeni, isteğin gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve gerekiyorsa yeni resource
değerini içerir. istek bir yazmadır.
request
nesnesi aynı zamanda request.auth
nesnesinde kullanıcının benzersiz kimliğini ve Firebase Kimlik Doğrulama yükünü de içerir; bu, belgelerin Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanacaktır.
request
nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:
Mülk | Tip | Tanım |
---|---|---|
auth | harita<dize, dize> | Bir kullanıcı oturum açtığında, uid , kullanıcının benzersiz kimliği ve token Firebase Authentication JWT iddialarının bir haritasını sağlar. Aksi halde null olacaktır. |
params | harita<dize, dize> | İsteğin sorgu parametrelerini içeren harita. |
path | yol | İsteğin gerçekleştirildiği yolu temsil eden path . |
resource | harita<dize, dize> | Yalnızca write isteklerinde mevcut olan yeni kaynak değeri. |
time | zaman damgası | İsteğin değerlendirildiği sunucu zamanını temsil eden zaman damgası. |
Kaynak Değerlendirmesi
Kuralları değerlendirirken karşıya 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 vermek veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin vermek gibi işlemleri yapan karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.
Cloud Storage için Firebase Güvenlik Kuralları, bir Cloud Storage nesnesinde ortaya çıkan meta verilerin anahtar/değer çiftlerini içeren resource
nesnesinde dosya meta verileri sağlar. Bu özellikler, veri bütünlüğünü sağlamak için read
veya write
istekleri üzerine incelenebilir.
write
isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), istek yolunda o anda mevcut olan dosyanın dosya meta verilerini içeren resource
nesnesine ek olarak request.resource
nesnesini kullanma olanağına da sahipsiniz. yazmaya izin veriliyorsa yazılacak dosya meta verilerinin bir alt kümesini içerir. Veri bütünlüğünü sağlamak veya dosya türü veya boyutu gibi uygulama kısıtlamalarını uygulamak için bu iki değeri kullanabilirsiniz.
resource
nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:
Mülk | Tip | Tanım |
---|---|---|
name | sicim | Nesnenin tam adı |
bucket | sicim | Bu nesnenin bulunduğu paketin adı. |
generation | int | Bu nesnenin Google Cloud Storage nesnesi oluşturma . |
metageneration | int | Bu nesnenin Google Cloud Storage nesne meta üretimi . |
size | int | Bayt cinsinden nesnenin boyutu. |
timeCreated | zaman damgası | Bir nesnenin oluşturulduğu zamanı temsil eden zaman damgası. |
updated | zaman damgası | Bir nesnenin en son güncellendiği zamanı temsil eden zaman damgası. |
md5Hash | sicim | Nesnenin MD5 karması. |
crc32c | sicim | Nesnenin crc32c karması. |
etag | sicim | Bu nesneyle ilişkili etag. |
contentDisposition | sicim | Bu nesneyle ilişkili içerik düzeni. |
contentEncoding | sicim | Bu nesneyle ilişkili içerik kodlaması. |
contentLanguage | sicim | Bu nesneyle ilişkili içerik dili. |
contentType | sicim | Bu nesneyle ilişkili içerik türü. |
metadata | harita<dize, dize> | Geliştirici tarafından belirlenen ek özel meta verilerin anahtar/değer çiftleri. |
request.resource
generation
, metageneration
, etag
, timeCreated
ve updated
dışında bunların tümünü içerir.
Cloud Firestore ile geliştirin
Diğer yetkilendirme kriterlerini değerlendirmek için Cloud Firestore'daki belgelere erişebilirsiniz.
firestore.get()
ve firestore.exists()
işlevlerini kullanarak güvenlik kurallarınız, Cloud Firestore'daki belgelere karşı gelen istekleri değerlendirebilir. firestore.get()
ve firestore.exists()
işlevlerinin her ikisi de tam olarak belirlenmiş belge yolları bekler. firestore.get()
ve firestore.exists()
için yollar oluşturmak amacıyla değişkenleri kullanırken, $(variable)
sözdizimini kullanarak değişkenlerden açıkça çıkış yapmanız gerekir.
Aşağıdaki örnekte, dosyalara okuma erişimini belirli kulüplere üye olan kullanıcılarla 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 } } }Bir 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 Bulut Depolama Güvenlik Kurallarınızı oluşturup kaydettiğinizde, Firebase konsolunda veya Firebase CLI'de iki ürünü bağlama izinlerini etkinleştirmeniz istenir.
Firebase Güvenlik Kurallarını 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ğrula
Cloud Storage için Firebase Güvenlik Kuralları, dosya adı 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 Güvenlik Kurallarınız daha karmaşık hale geldikçe, koşul kümelerini kural kümenizde yeniden kullanabileceğiniz işlevlere sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript'e benzer, ancak Firebase Güvenlik Kuralları işlevleri, bazı önemli sınırlamalara sahip, alana özgü bir dilde yazılmıştır:
- Fonksiyonlar yalnızca tek bir
return
deyimi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin döngüleri yürütemezler veya harici hizmetleri arayamazlar. - İş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şlevinresource
değişkenine erişimi vardır ve yalnızca Cloud Firestore içinget()
veexists()
gibi yerleşik işlevlere erişim vardır. - Fonksiyonlar diğer fonksiyonları çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
-
rules2
sürümünde işlevler,let
anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler herhangi bir sayıda let bağlamasına sahip olabilir, ancak bir return ifadesiyle bitmeleri gerekir.
Bir işlev, function
anahtar sözcüğüyle 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 tür koşulu tek bir fonksiyonda 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 bu kuralların daha sürdürülebilir olmasını sağlar.
Sonraki adımlar
Koşullarla ilgili bu tartışmanın ardından Kurallar hakkında daha kapsamlı bir anlayışa sahip olursunuz ve şunları yapmaya hazırsınız:
Temel kullanım durumlarını nasıl ele alacağınızı öğrenin ve Kuralları geliştirmeye, test etmeye ve dağıtmaya yönelik iş akışını öğrenin:
- Yaygın senaryolara yönelik kurallar yazın.
- Güvenli olmayan Kuralları tespit etmeniz ve bunlardan kaçınmanız gereken durumları gözden geçirerek bilginizi geliştirin.
- Cloud Storage öykünücüsünü ve özel Güvenlik Kuralları test kitaplığını kullanarak kuralları test edin.
- Kuralları dağıtmak için mevcut yöntemleri inceleyin.