Bu kılavuz, Bulut Depolama için Firebase Güvenlik Kurallarınıza nasıl koşul ekleyeceğinizi göstermek için Firebase Güvenlik Kuralları dil kılavuzunun temel söz dizimini temel alır.
Cloud Storage Güvenlik Kurallarının birincil yapı taşı koşuldur . Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir mantıksal ifadedir. Temel kurallar için, koşul olarak true
ve false
hazır değerleri kullanmak gayet iyi çalışıyor. Ancak Cloud Storage dili için Firebase Güvenlik Kuralları, size aşağıdakileri yapabilecek daha karmaşık koşullar yazmanız için yollar sunar:
- Kullanıcı kimlik doğrulamasını kontrol edin
- Gelen verileri doğrula
kimlik doğrulama
Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulaması sağlamak için Firebase Authentication ile entegre olur. Bu, bir Firebase Kimlik Doğrulama belirtecinin taleplerine dayalı ayrıntılı erişim kontrolüne izin verir.
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
) ve ayrıca Firebase Authentication JWT'nin ( request.auth.token
) talepleri ile doldurulur.
Ek olarak, özel kimlik doğrulama kullanılırken request.auth.token
alanında ek talepler gösterilir.
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ğrulamasını kullanmanın birkaç yaygın yolu vardır:
- Genel:
request.auth
yok sayın - Kimliği doğrulanmış özel:
request.auth
null
olmadığını kontrol edin - Kullanıcıya özel:
request.auth.uid
bir yoluid
eşit olduğunu kontrol edin - Özel grup: seçilen bir taleple eşleşmek için özel jetonun taleplerini kontrol edin veya bir meta veri alanı 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
bir kural olarak kabul edilebilir. Bu kurallar, oyun varlıkları, ses dosyaları veya diğer statik içerik gibi genel verileri ortaya çıkarmak 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ış özel
Belirli durumlarda, verilerin uygulamanızın tüm kimliği doğrulanmış kullanıcıları tarafından görüntülenebilir olmasını isteyebilirsiniz, 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ğrulaması gerektirmek 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ı özel
Şu ana kadar request.auth
için en yaygın kullanım durumu, bireysel kullanıcılara dosyalarında ayrıntılı izinler sağlamak olacaktır: profil resimlerini yüklemekten özel belgeleri okumaya kadar.
Cloud Storage'daki dosyaların dosyaya giden tam bir "yolu" olduğundan, bir kullanıcı tarafından kontrol edilen bir dosya yapmak için gereken tek şey, dosya adı ön ekindeki (kullanıcının uid
gibi) kontrol edilebilen benzersiz, kullanıcıyı tanımlayan bilgilerdir. 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
Eşit derecede yaygın başka bir kullanım durumu, 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 yapmak için birkaç yaklaşım vardır:
- Bir grup üyesi hakkında ek bilgiler (grup kimliği gibi) içeren bir Firebase Kimlik Doğrulaması özel belirteci oluşturun
- Dosya meta verilerine grup bilgilerini (bir grup kimliği veya yetkili
uid
listesi gibi) dahil edin
Bu veriler belirteç veya dosya meta verilerinde depolandıktan sonra, 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 silmeler, 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 yüküne ek olarak request
değişkeni, talebin gerçekleştirildiği dosya yolunu, talebin alındığı zamanı ve varsa yeni resource
değerini içerir. istek bir yazıdır.
request
nesnesi ayrıca, belgelerin Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanacak olan request.auth
nesnesinde kullanıcının benzersiz kimliğini ve Firebase Kimlik Doğrulaması yükünü de içerir.
request
nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:
Mülk | Tip | Tanım |
---|---|---|
auth | harita<dize, dizi> | Bir kullanıcı oturum açtığında, kullanıcının benzersiz kimliği olan uid ve Firebase Authentication JWT taleplerinin bir haritası olan token sağlar. Aksi takdirde, null olacaktır. |
params | harita<dize, dizi> | İsteğin sorgu parametrelerini içeren harita. |
path | yol | İsteğin gerçekleştirildiği yolu temsil eden bir path . |
resource | harita<dize, dizi> | Yalnızca write isteklerinde mevcut olan 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, 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 veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin vermek gibi şeyler 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
isteklerinde incelenebilir.
write
isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), istek yolunda mevcut dosya için dosya meta verilerini içeren resource
nesnesine ek olarak request.resource
nesnesini de kullanabilirsiniz. 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 Bulut Depolama nesnesi oluşturma . |
metageneration | int | Bu nesnenin Google Bulut Depolama nesnesi meta üretimi . |
size | int | Nesnenin bayt cinsinden boyutu. |
timeCreated | zaman damgası | Bir nesnenin oluşturulduğu zamanı temsil eden bir zaman damgası. |
updated | zaman damgası | Bir nesnenin en son güncellendiği zamanı temsil eden bir zaman damgası. |
md5Hash | sicim | Nesnenin bir MD5 karması. |
crc32c | sicim | Nesnenin bir crc32c karması. |
etag | sicim | Bu nesneyle ilişkili etag. |
contentDisposition | sicim | Bu nesneyle ilişkili içerik düzenlemesi. |
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, dizi> | Ek, geliştirici tarafından belirlenen özel meta verilerin anahtar/değer çiftleri. |
request.resource
generation
, metageneration
, etag
, timeCreated
ve updated
dışında bunların hepsini 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 gelen istekleri Cloud Firestore'daki belgelere göre değerlendirebilir. firestore.get()
ve firestore.exists()
işlevlerinin her ikisi de tamamen belirtilmiş belge yolları bekler. firestore.get()
ve firestore.exists()
için yollar oluşturmak üzere değişkenleri kullanırken, $(variable)
sözdizimini kullanarak değişkenlerden açıkça kaçmanız gerekir.
Aşağıdaki örnekte, dosyalara okuma erişimini belirli kulüplerin üyesi olan kullanıcılarla sınırlayan 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 Güvenlik Kurallarınızı oluşturup kaydettikten sonra, Firebase konsolunda veya Firebase CLI'de iki ürünü bağlamak için izinleri 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 özelliği devre dışı bırakabilirsiniz.
Verileri doğrula
Cloud Storage için Firebase Güvenlik Kuralları, dosya adının ve yolunun yanı sıra contentType
ve size
gibi dosya meta veri özelliklerinin doğrulanması 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 kümenizde yeniden kullanabileceğiniz işlevlerdeki koşul kümelerini 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ırlamaları olan, alana özgü bir dilde yazılır:
- İşlevler yalnızca tek bir
return
ifadesi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin, döngüleri yürütemezler veya harici hizmetleri çağıramazlar. - Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilirler. Örneğin,
service firebase.storage
kapsamında tanımlanan bir işlevinresource
değişkenine ve yalnızca Cloud Firestore içinget()
veexists()
gibi yerleşik işlevlere erişimi vardır. - İşlevler diğer işlevleri çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
-
rules2
sürümünde, işlevlerlet
anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler herhangi bir sayıda let bağlamasına sahip olabilir, ancak bir dönüş ifadesiyle bitmelidir.
Bir işlev, function
anahtar sözcüğüyle tanımlanır ve sıfır veya daha fazla argüman 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 onları daha sürdürülebilir hale getirir.
Sonraki adımlar
Koşullarla ilgili bu tartışmadan sonra, Kurallar konusunda daha gelişmiş bir anlayışa sahip oldunuz ve şunları yapmaya hazırsınız:
Temel kullanım durumlarını nasıl ele alacağınızı öğrenin ve Kuralları geliştirmek, test etmek ve dağıtmak için iş akışını öğrenin:
- Yaygın senaryoları ele alan kurallar yazın.
- Güvenli olmayan Kuralları tespit etmeniz ve bunlardan kaçınmanız gereken durumları gözden geçirerek bilginizi geliştirin.
- Bulut Depolama öykünücüsünü ve özel Güvenlik Kuralları test kitaplığını kullanarak kuralları test edin.
- Kuralları dağıtmak için kullanılabilecek yöntemleri gözden geçirin.