Firebase Güvenlik Kuralları, çok çeşitli karmaşıklığı ve ayrıntı düzeyini destekleyen esnek, güçlü, özel dillerden yararlanır. Kurallarınızı, uygulamanız için anlamlı olduğu kadar özel veya genel yapabilirsiniz. Gerçek Zamanlı Veritabanı kuralları, bir JSON yapısında JavaScript'e benzeyen bir sözdizimi kullanır. Cloud Firestore ve Cloud Storage kuralları, CEL üzerinde match
ve koşullu olarak verilen erişimi destekleyen ifadelere allow
Ortak İfade Dili (CEL) tabanlı bir dil kullanır.
Ancak bunlar özel diller olduğundan, bir öğrenme eğrisi vardır. Daha karmaşık kurallara daldıkça Kurallar dilini daha iyi anlamak için bu kılavuzu kullanın.
Kuralları hakkında daha fazla bilgi edinmek için bir ürün seçin.
Basit yapı
Bulut Firestore
Cloud Firestore ve Cloud Storage'daki Firebase Güvenlik Kuralları, aşağıdaki yapıyı ve sözdizimini kullanır:
service <<name>> {
// Match the resource path.
match <<path>> {
// Allow the request if the following conditions are true.
allow <<methods>> : if <<condition>>
}
}
Kuralları oluştururken aşağıdaki temel kavramları anlamanız önemlidir:
- İstek:
allow
ifadesinde çağrılan yöntem veya yöntemler. Bunlar çalışmasına izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır:get
,list
,create
,update
vedelete
.read
vewrite
kolaylık yöntemleri, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar. - Yol: URI yolu olarak temsil edilen veritabanı veya depolama konumu.
- Kural: Doğru olarak değerlendirilirse bir isteğe izin veren bir koşulu içeren
allow
deyimi.
Bu kavramların her biri aşağıda daha ayrıntılı olarak açıklanmaktadır.
Bulut depolama
Cloud Firestore ve Cloud Storage'daki Firebase Güvenlik Kuralları, aşağıdaki yapıyı ve sözdizimini kullanır:
service <<name>> {
// Match the resource path.
match <<path>> {
// Allow the request if the following conditions are true.
allow <<methods>> : if <<condition>>
}
}
Kuralları oluştururken aşağıdaki temel kavramları anlamanız önemlidir:
- İstek:
allow
ifadesinde çağrılan yöntem veya yöntemler. Bunlar çalışmasına izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır:get
,list
,create
,update
vedelete
.read
vewrite
kolaylık yöntemleri, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar. - Yol: URI yolu olarak temsil edilen veritabanı veya depolama konumu.
- Kural: Doğru olarak değerlendirilirse bir isteğe izin veren bir koşulu içeren
allow
deyimi.
Bu kavramların her biri aşağıda daha ayrıntılı olarak açıklanmaktadır.
Gerçek Zamanlı Veritabanı
Gerçek Zamanlı Veritabanında Firebase Güvenlik Kuralları, bir JSON belgesinde yer alan JavaScript benzeri ifadelerden oluşur.
Aşağıdaki sözdizimini kullanırlar:
{
"rules": {
"<<path>>": {
// Allow the request if the condition for each method is true.
".read": <<condition>>,
".write": <<condition>>,
".validate": <<condition>>
}
}
}
Kuralda üç temel unsur vardır:
- Yol: Veritabanı konumu. Bu, veritabanınızın JSON yapısını yansıtır.
- İstek: Bunlar, kuralın erişim izni vermek için kullandığı yöntemlerdir.
read
vewrite
kuralları, geniş okuma ve yazma erişimi sağlarkenvalidate
kuralları, gelen veya mevcut verilere dayalı olarak erişim vermek için ikincil bir doğrulama işlevi görür. - Koşul: Doğru olarak değerlendirilirse bir isteğe izin veren koşul.
Kural yapıları
Bulut Firestore
Cloud Firestore ve Cloud Storage'daki bir kuralın temel öğeleri aşağıdaki gibidir:
-
service
bildirimi: Kuralların geçerli olduğu Firebase ürününü bildirir. -
match
bloğu: Kuralların geçerli olduğu veritabanı veya depolama paketinde bir yol tanımlar. -
allow
deyimi: Yöntemlere göre farklılaştırılmış erişim izni koşulları sağlar. Desteklenen yöntemler şunları içerir:get
,list
,create
,update
,delete
ve kolaylık yöntemleriread
vewrite
. - İsteğe bağlı
function
bildirimleri: Birden çok kuralda kullanım için koşulları birleştirme ve sarmalama yeteneği sağlayın.
service
, isteklere erişim sağlayan koşullar sağlayan allow
ifadelerine sahip bir veya daha fazla match
bloğu içerir. request
ve resource
değişkenleri, kural koşullarında kullanılabilir. Firebase Güvenlik Kuralları dili, function
bildirimlerini de destekler.
sözdizimi sürümü
syntax
ifadesi, kaynağı yazmak için kullanılan Firebase Kuralları dilinin sürümünü belirtir. Dilin en son sürümü v2
.
rules_version = '2';
service cloud.firestore {
...
}
Herhangi bir rules_version
ifadesi sağlanmazsa, kurallarınız v1
motoru kullanılarak değerlendirilecektir.
Hizmet
service
bildirimi, kurallarınızın hangi Firebase ürünü veya hizmeti için geçerli olduğunu tanımlar. Kaynak dosya başına yalnızca bir service
bildirimi ekleyebilirsiniz.
Bulut Firestore
service cloud.firestore {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Bulut depolama
service firebase.storage {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Firebase CLI'yi kullanarak hem Cloud Firestore hem de Cloud Storage için kurallar tanımlıyorsanız, bunları ayrı dosyalarda tutmanız gerekir.
Kibrit
Bir match
bloğu, istenen işlem (gelen request.path
) için yolla eşleşen bir path
deseni bildirir. match
gövdesinde bir veya daha fazla iç içe geçmiş match
bloğu, allow
ifadeleri veya function
bildirimleri bulunmalıdır. İç içe match
bloklarındaki yol, üst match
bloğundaki yola göre görecelidir.
path
modeli, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path
deseni, tek yollu segment ve çok yollu segment eşleşmelerine izin verir. Bir path
bağlı tüm değişkenler, match
kapsamında veya path
bildirildiği herhangi bir iç içe kapsam içinde görünür.
Bir path
modeline karşı eşleşmeler kısmi veya tam olabilir:
- Kısmi eşleşmeler:
path
kalıbı,request.path
ön ek eşleşmesidir. - Tam eşleşmeler:
path
modeli,request.path
tamamıyla eşleşir.
Tam bir eşleşme yapıldığında, blok içindeki kurallar değerlendirilir. Kısmi eşleşme yapıldığında, iç içe geçmiş herhangi bir path
eşleşmeyi tamamlayıp tamamlamayacağını görmek için iç içe match
kuralları test edilir.
Tamamlanan her match
kurallar, isteğe izin verilip verilmeyeceğini belirlemek için değerlendirilir. Eşleşen herhangi bir kural erişim izni verirse, isteğe izin verilir. Hiçbir eşleşen kural erişim izni vermiyorsa istek reddedilir.
// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
// Partial match.
match /example/{singleSegment} { // `singleSegment` == 'hello'
allow write; // Write rule not evaluated.
// Complete match.
match /nested/path { // `singleSegment` visible in scope.
allow read; // Read rule is evaluated.
}
}
// Complete match.
match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
allow read; // Read rule is evaluated.
}
}
Yukarıdaki örneğin gösterdiği gibi, path
bildirimleri aşağıdaki değişkenleri destekler:
- Tek parçalı joker karakter: Bir joker karakter değişkeni, bir değişkeni kaşlı ayraçlar içine alarak bir yolda bildirilir:
{variable}
. Bu değişkene,match
deyimi içinde birstring
olarak erişilebilir. - Özyinelemeli joker karakter: Yinelemeli veya çok parçalı joker karakter, bir yolun üzerinde veya altındaki birden çok yol parçasıyla eşleşir. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Bunu, segment değişkeninizin sonuna
=**
dizesini ekleyerek beyan edebilirsiniz:{variable=**}
. Bu değişkene,match
deyimi içinde birpath
nesnesi olarak erişilebilir.
İzin vermek
match
bloğu bir veya daha fazla allow
ifadesi içerir. Bunlar sizin gerçek kurallarınızdır. allow
kurallarını bir veya daha fazla yönteme uygulayabilirsiniz. Bir allow
ifadesindeki koşullar, gelen herhangi bir isteğin kabul edilmesi için Cloud Firestore veya Cloud Storage için doğru olarak değerlendirilmelidir. Ayrıca allow
deyimlerini koşulsuz yazabilirsiniz, örneğin allow read
. Bununla birlikte, allow
ifadesi bir koşul içermiyorsa, her zaman bu yöntem için isteğe izin verir.
Yöntem için allow
kurallarından herhangi biri karşılanırsa, isteğe izin verilir. Ayrıca, daha geniş bir kural erişim izni verirse, Kurallar erişim izni verir ve erişimi sınırlayabilecek daha ayrıntılı kuralları yok sayar.
Herhangi bir kullanıcının kendi dosyalarından herhangi birini okuyabildiği veya silebildiği aşağıdaki örneği ele alalım. Daha ayrıntılı bir kural, yalnızca yazmayı isteyen kullanıcı dosyanın sahibiyse ve dosya bir PNG ise yazmaya izin verir. Bir kullanıcı, PNG olmasalar bile alt yoldaki herhangi bir dosyayı silebilir çünkü önceki kural buna izin verir.
service firebase.storage {
// Allow the requestor to read or delete any resource on a path under the
// user directory.
match /users/{userId}/{anyUserFile=**} {
allow read, delete: if request.auth != null && request.auth.uid == userId;
}
// Allow the requestor to create or update their own images.
// When 'request.method' == 'delete' this rule and the one matching
// any path under the user directory would both match and the `delete`
// would be permitted.
match /users/{userId}/images/{imageId} {
// Whether to permit the request depends on the logical OR of all
// matched rules. This means that even if this rule did not explicitly
// allow the 'delete' the earlier rule would have.
allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
}
}
Yöntem
Her allow
ifadesi, aynı yöntemin gelen isteklerine erişim sağlayan bir yöntem içerir.
Yöntem | İstek tipi |
---|---|
Kolaylık yöntemleri | |
read | Her türlü okuma isteği |
write | Her türlü yazma isteği |
standart yöntemler | |
get | Tek belgeler veya dosyalar için okuma istekleri |
list | Sorgular ve koleksiyonlar için okuma istekleri |
create | Yeni belgeler veya dosyalar yazın |
update | Mevcut veritabanı belgelerine yazın veya dosya meta verilerini güncelleyin |
delete | Verileri sil |
Aynı match
bloğundaki okuma yöntemlerini veya aynı path
bildirimindeki çakışan yazma yöntemlerini çakıştıramazsınız.
Örneğin, aşağıdaki kurallar başarısız olur:
service bad.example {
match /rules/with/overlapping/methods {
// This rule allows reads to all authenticated users
allow read: if request.auth != null;
match another/subpath {
// This secondary, more specific read rule causes an error
allow get: if request.auth != null && request.auth.uid == "me";
// Overlapping write methods in the same path cause an error as well
allow write: if request.auth != null;
allow create: if request.auth != null && request.auth.uid == "me";
}
}
}
İşlev
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 güvenlik kuralları işlevleri, bazı önemli sınırlamaları olan etki alanına ö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 cloud.firestore
kapsamında tanımlanan bir işlevin,resource
değişkenine veget()
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 20 ile sınırlıdır.
- Kural sürümü
v2
, işlevler,let
anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler en fazla 10 izin 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 cloud.firestore {
match /databases/{database}/documents {
// 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 /cities/{city} {
allow read, write: if signedInOrPublic();
}
match /users/{user} {
allow read, write: if signedInOrPublic();
}
}
}
İşte işlev bağımsız değişkenlerini ve izin atamalarını gösteren bir örnek. Let atama ifadeleri noktalı virgülle ayrılmalıdır.
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
return isAuthor || isAdmin;
}
isAdmin
atamasının, admins koleksiyonunun aranmasını nasıl zorunlu kıldığına dikkat edin. Gereksiz aramalar gerektirmeden tembel değerlendirme için &&
(AND) ve ||
(VEYA) karşılaştırmaları, yalnızca isAuthor
doğru ( &&
karşılaştırmaları için) veya yanlış ( ||
karşılaştırmaları için) olduğu gösterildiğinde ikinci bir işlevi çağırmak için.
function isAdmin(userId) {
return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
// `||` is short-circuiting; isAdmin called only if isAuthor == false.
return isAuthor || isAdmin(userId);
}
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.
Bulut depolama
Cloud Firestore ve Cloud Storage'daki bir kuralın temel öğeleri aşağıdaki gibidir:
-
service
bildirimi: Kuralların geçerli olduğu Firebase ürününü bildirir. -
match
bloğu: Kuralların geçerli olduğu veritabanı veya depolama paketinde bir yol tanımlar. -
allow
deyimi: Yöntemlere göre farklılaştırılmış erişim izni koşulları sağlar. Desteklenen yöntemler şunları içerir:get
,list
,create
,update
,delete
ve kolaylık yöntemleriread
vewrite
. - İsteğe bağlı
function
bildirimleri: Birden çok kuralda kullanım için koşulları birleştirme ve sarmalama yeteneği sağlayın.
service
, isteklere erişim sağlayan koşullar sağlayan allow
ifadelerine sahip bir veya daha fazla match
bloğu içerir. request
ve resource
değişkenleri, kural koşullarında kullanılabilir. Firebase Güvenlik Kuralları dili, function
bildirimlerini de destekler.
sözdizimi sürümü
syntax
ifadesi, kaynağı yazmak için kullanılan Firebase Kuralları dilinin sürümünü belirtir. Dilin en son sürümü v2
.
rules_version = '2';
service cloud.firestore {
...
}
Herhangi bir rules_version
ifadesi sağlanmazsa, kurallarınız v1
motoru kullanılarak değerlendirilecektir.
Hizmet
service
bildirimi, kurallarınızın hangi Firebase ürünü veya hizmeti için geçerli olduğunu tanımlar. Kaynak dosya başına yalnızca bir service
bildirimi ekleyebilirsiniz.
Bulut Firestore
service cloud.firestore {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Bulut depolama
service firebase.storage {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Firebase CLI'yi kullanarak hem Cloud Firestore hem de Cloud Storage için kurallar tanımlıyorsanız, bunları ayrı dosyalarda tutmanız gerekir.
Kibrit
Bir match
bloğu, istenen işlem (gelen request.path
) için yolla eşleşen bir path
deseni bildirir. match
gövdesinde bir veya daha fazla iç içe geçmiş match
bloğu, allow
ifadeleri veya function
bildirimleri bulunmalıdır. İç içe match
bloklarındaki yol, üst match
bloğundaki yola göre görecelidir.
path
modeli, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path
deseni, tek yollu segment ve çok yollu segment eşleşmelerine izin verir. Bir path
bağlı tüm değişkenler, match
kapsamında veya path
bildirildiği herhangi bir iç içe kapsam içinde görünür.
Bir path
modeline karşı eşleşmeler kısmi veya tam olabilir:
- Kısmi eşleşmeler:
path
kalıbı,request.path
ön ek eşleşmesidir. - Tam eşleşmeler:
path
modeli,request.path
tamamıyla eşleşir.
Tam bir eşleşme yapıldığında, blok içindeki kurallar değerlendirilir. Kısmi eşleşme yapıldığında, iç içe geçmiş herhangi bir path
eşleşmeyi tamamlayıp tamamlamayacağını görmek için iç içe match
kuralları test edilir.
Tamamlanan her match
kurallar, isteğe izin verilip verilmeyeceğini belirlemek için değerlendirilir. Eşleşen herhangi bir kural erişim izni verirse, isteğe izin verilir. Hiçbir eşleşen kural erişim izni vermiyorsa istek reddedilir.
// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
// Partial match.
match /example/{singleSegment} { // `singleSegment` == 'hello'
allow write; // Write rule not evaluated.
// Complete match.
match /nested/path { // `singleSegment` visible in scope.
allow read; // Read rule is evaluated.
}
}
// Complete match.
match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
allow read; // Read rule is evaluated.
}
}
Yukarıdaki örneğin gösterdiği gibi, path
bildirimleri aşağıdaki değişkenleri destekler:
- Tek parçalı joker karakter: Bir joker karakter değişkeni, bir değişkeni kaşlı ayraçlar içine alarak bir yolda bildirilir:
{variable}
. Bu değişkene,match
deyimi içinde birstring
olarak erişilebilir. - Özyinelemeli joker karakter: Yinelemeli veya çok parçalı joker karakter, bir yolun üzerinde veya altındaki birden çok yol parçasıyla eşleşir. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Bunu, segment değişkeninizin sonuna
=**
dizesini ekleyerek beyan edebilirsiniz:{variable=**}
. Bu değişkene,match
deyimi içinde birpath
nesnesi olarak erişilebilir.
İzin vermek
match
bloğu bir veya daha fazla allow
ifadesi içerir. Bunlar sizin gerçek kurallarınızdır. allow
kurallarını bir veya daha fazla yönteme uygulayabilirsiniz. Bir allow
ifadesindeki koşullar, gelen herhangi bir isteğin kabul edilmesi için Cloud Firestore veya Cloud Storage için doğru olarak değerlendirilmelidir. Ayrıca allow
deyimlerini koşulsuz yazabilirsiniz, örneğin allow read
. Bununla birlikte, allow
ifadesi bir koşul içermiyorsa, her zaman bu yöntem için isteğe izin verir.
Yöntem için allow
kurallarından herhangi biri karşılanırsa, isteğe izin verilir. Ayrıca, daha geniş bir kural erişim izni verirse, Kurallar erişim izni verir ve erişimi sınırlayabilecek daha ayrıntılı kuralları yok sayar.
Herhangi bir kullanıcının kendi dosyalarından herhangi birini okuyabildiği veya silebildiği aşağıdaki örneği ele alalım. Daha ayrıntılı bir kural, yalnızca yazmayı isteyen kullanıcı dosyanın sahibiyse ve dosya bir PNG ise yazmaya izin verir. Bir kullanıcı, PNG olmasalar bile alt yoldaki herhangi bir dosyayı silebilir çünkü önceki kural buna izin verir.
service firebase.storage {
// Allow the requestor to read or delete any resource on a path under the
// user directory.
match /users/{userId}/{anyUserFile=**} {
allow read, delete: if request.auth != null && request.auth.uid == userId;
}
// Allow the requestor to create or update their own images.
// When 'request.method' == 'delete' this rule and the one matching
// any path under the user directory would both match and the `delete`
// would be permitted.
match /users/{userId}/images/{imageId} {
// Whether to permit the request depends on the logical OR of all
// matched rules. This means that even if this rule did not explicitly
// allow the 'delete' the earlier rule would have.
allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
}
}
Yöntem
Her allow
ifadesi, aynı yöntemin gelen isteklerine erişim sağlayan bir yöntem içerir.
Yöntem | İstek tipi |
---|---|
Kolaylık yöntemleri | |
read | Her türlü okuma isteği |
write | Her türlü yazma isteği |
standart yöntemler | |
get | Tek belgeler veya dosyalar için okuma istekleri |
list | Sorgular ve koleksiyonlar için okuma istekleri |
create | Yeni belgeler veya dosyalar yazın |
update | Mevcut veritabanı belgelerine yazın veya dosya meta verilerini güncelleyin |
delete | Verileri sil |
Aynı match
bloğundaki okuma yöntemlerini veya aynı path
bildirimindeki çakışan yazma yöntemlerini çakıştıramazsınız.
Örneğin, aşağıdaki kurallar başarısız olur:
service bad.example {
match /rules/with/overlapping/methods {
// This rule allows reads to all authenticated users
allow read: if request.auth != null;
match another/subpath {
// This secondary, more specific read rule causes an error
allow get: if request.auth != null && request.auth.uid == "me";
// Overlapping write methods in the same path cause an error as well
allow write: if request.auth != null;
allow create: if request.auth != null && request.auth.uid == "me";
}
}
}
İşlev
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 güvenlik kuralları işlevleri, bazı önemli sınırlamaları olan etki alanına ö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 cloud.firestore
kapsamında tanımlanan bir işlevin,resource
değişkenine veget()
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 20 ile sınırlıdır.
- Kural sürümü
v2
, işlevler,let
anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler en fazla 10 izin 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 cloud.firestore {
match /databases/{database}/documents {
// 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 /cities/{city} {
allow read, write: if signedInOrPublic();
}
match /users/{user} {
allow read, write: if signedInOrPublic();
}
}
}
İşte işlev bağımsız değişkenlerini ve izin atamalarını gösteren bir örnek. Let atama ifadeleri noktalı virgülle ayrılmalıdır.
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
return isAuthor || isAdmin;
}
isAdmin
atamasının, admins koleksiyonunun aranmasını nasıl zorunlu kıldığına dikkat edin. Gereksiz aramalar gerektirmeden tembel değerlendirme için &&
(AND) ve ||
(VEYA) karşılaştırmaları, yalnızca isAuthor
doğru ( &&
karşılaştırmaları için) veya yanlış ( ||
karşılaştırmaları için) olduğu gösterildiğinde ikinci bir işlevi çağırmak için.
function isAdmin(userId) {
return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
// `||` is short-circuiting; isAdmin called only if isAuthor == false.
return isAuthor || isAdmin(userId);
}
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.
Gerçek Zamanlı Veritabanı
Yukarıda özetlendiği gibi, Gerçek Zamanlı Veritabanı Kuralları üç temel öğe içerir: veritabanının JSON yapısının bir aynası olarak veritabanı konumu, istek türü ve erişim sağlayan koşul.
Veritabanı konumu
Kurallarınızın yapısı, veritabanınızda sakladığınız verilerin yapısını takip etmelidir. Örneğin, bir mesaj listesi içeren bir sohbet uygulamasında şuna benzeyen verileriniz olabilir:
{
"messages": {
"message0": {
"content": "Hello",
"timestamp": 1405704370369
},
"message1": {
"content": "Goodbye",
"timestamp": 1405704395231
},
...
}
}
Kurallarınız bu yapıyı yansıtmalıdır. Örneğin:
{
"rules": {
"messages": {
"$message": {
// only messages from the last ten minutes can be read
".read": "data.child('timestamp').val() > (now - 600000)",
// new messages must have a string content and a number timestamp
".validate": "newData.hasChildren(['content', 'timestamp']) &&
newData.child('content').isString() &&
newData.child('timestamp').isNumber()"
}
}
}
}
Yukarıdaki örneğin gösterdiği gibi, Gerçek Zamanlı Veritabanı Kuralları, yol segmentlerini eşleştirmek için bir $location
değişkenini destekler. Kuralınızı yol boyunca herhangi bir alt düğümle eşleştirmek için yol parçanızın önündeki $
önekini kullanın.
{
"rules": {
"rooms": {
// This rule applies to any child of /rooms/, the key for each room id
// is stored inside $room_id variable for reference
"$room_id": {
"topic": {
// The room's topic can be changed if the room id has "public" in it
".write": "$room_id.contains('public')"
}
}
}
}
}
$variable
sabit yol adlarıyla paralel olarak da kullanabilirsiniz.
{
"rules": {
"widget": {
// a widget can have a title or color attribute
"title": { ".validate": true },
"color": { ".validate": true },
// but no other child paths are allowed
// in this case, $other means any key excluding "title" and "color"
"$other": { ".validate": false }
}
}
}
Yöntem
Gerçek Zamanlı Veritabanında üç tür kural vardır. Bu kural türlerinden ikisi - read
ve write
- gelen bir isteğin yöntemine uygulanır. validate
kuralı türü, veri yapılarını zorlar ve verilerin biçimini ve içeriğini doğrular. Kurallar, bir .write
kuralının erişim izni verdiğini doğruladıktan sonra .validate
kurallarını çalıştırır.
Kural Türleri | |
---|---|
.Okumak | Verilerin kullanıcılar tarafından okunmasına izin verilip verilmediğini ve ne zaman izin verildiğini açıklar. |
.yazmak | Verilerin yazılmasına izin verilip verilmediğini ve ne zaman izin verildiğini açıklar. |
.doğrula | Doğru biçimlendirilmiş bir değerin nasıl görüneceğini, alt niteliklere sahip olup olmadığını ve veri türünü tanımlar. |
Varsayılan olarak, buna izin veren bir kural yoksa yola erişim reddedilir.
Bina koşulları
Bulut Firestore
Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir mantıksal ifadedir. request
ve resource
değişkenleri, bu koşullar için bağlam sağlar.
request
değişkeni
request
değişkeni aşağıdaki alanları ve ilgili bilgileri içerir:
request.auth
Firebase Authentication'dan kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth
belirteci, bir dizi standart talep ve Firebase Kimlik Doğrulaması aracılığıyla oluşturduğunuz tüm özel talepleri içerir. Firebase Güvenlik Kuralları ve Kimlik Doğrulama hakkında daha fazla bilgi edinin.
request.method
request.method
standart yöntemlerden herhangi biri veya özel bir yöntem olabilir. read
ve write
kolaylık yöntemleri, sırasıyla tüm salt okunur veya tüm salt okunur standart yöntemlere uygulanan yazma kurallarını basitleştirmek için de mevcuttur.
request.params
request.params
özellikle request.resource
ile ilgili olmayan ve değerlendirme için yararlı olabilecek tüm verileri içerir. Uygulamada, bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak dışı veriler içermelidir. Hizmetler, param olarak sunulan anahtarların ve değerlerin hiçbirini yeniden adlandırmamaya veya türlerini değiştirmemeye dikkat etmelidir.
request.path
request.path
, hedef resource
yoludur. Yol, hizmete göredir. /
gibi url olmayan güvenli karakterler içeren yol segmentleri url kodludur.
resource
değişkeni
resource
anahtar/değer çiftlerinin bir haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşul içinde resource
başvurulması, hizmetten en fazla bir değer okumasıyla sonuçlanacaktır. Bu arama, kaynak için hizmetle ilgili tüm kotalara sayılır. get
istekleri için, resource
yalnızca reddetme kotasına sayılır.
Operatörler ve operatör önceliği
Operatörler ve bunların Cloud Firestore ve Cloud Storage Kuralları'ndaki ilgili öncelikleri için aşağıdaki tabloyu referans olarak kullanın.
Rastgele ifadeler a
ve b
verildiğinde, bir f
alanı ve bir i
indeksi.
Şebeke | Tanım | ilişkilendirilebilirlik |
---|---|---|
a[i] a() af | Dizin, çağrı, saha erişimi | soldan sağa | !a -a | tekli olumsuzlama | sağdan sola |
a/ba%ba*b | çarpım operatörleri | soldan sağa |
a+b ab | Katkı operatörleri | soldan sağa |
a>ba>=ba | ilişki operatörleri | soldan sağa |
a in b | Listede veya haritada bulunma | soldan sağa |
a is type | Türün bool, int, float, sayı, dizi, liste, harita, zaman damgası, süre, yol veya latlng olabileceği type karşılaştırması | soldan sağa |
a==ba!=b | Karşılaştırma işleçleri | soldan sağa | a && b | koşullu VE | soldan sağa |
a || b | koşullu VEYA | soldan sağa |
a ? true_value : false_value | üçlü ifade | soldan sağa |
Bulut depolama
Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir mantıksal ifadedir. request
ve resource
değişkenleri, bu koşullar için bağlam sağlar.
request
değişkeni
request
değişkeni aşağıdaki alanları ve ilgili bilgileri içerir:
request.auth
Firebase Authentication'dan kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth
belirteci, bir dizi standart talep ve Firebase Kimlik Doğrulaması aracılığıyla oluşturduğunuz tüm özel talepleri içerir. Firebase Güvenlik Kuralları ve Kimlik Doğrulama hakkında daha fazla bilgi edinin.
request.method
request.method
standart yöntemlerden herhangi biri veya özel bir yöntem olabilir. read
ve write
kolaylık yöntemleri, sırasıyla tüm salt okunur veya tüm salt okunur standart yöntemlere uygulanan yazma kurallarını basitleştirmek için de mevcuttur.
request.params
request.params
özellikle request.resource
ile ilgili olmayan ve değerlendirme için yararlı olabilecek tüm verileri içerir. Uygulamada, bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak dışı veriler içermelidir. Hizmetler, param olarak sunulan anahtarların ve değerlerin hiçbirini yeniden adlandırmamaya veya türlerini değiştirmemeye dikkat etmelidir.
request.path
request.path
, hedef resource
yoludur. Yol, hizmete göredir. /
gibi url olmayan güvenli karakterler içeren yol segmentleri url kodludur.
resource
değişkeni
resource
anahtar/değer çiftlerinin bir haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşul içinde resource
başvurulması, hizmetten en fazla bir değer okumasıyla sonuçlanacaktır. Bu arama, kaynak için hizmetle ilgili tüm kotalara sayılır. get
istekleri için, resource
yalnızca reddetme kotasına sayılır.
Operatörler ve operatör önceliği
Operatörler ve bunların Cloud Firestore ve Cloud Storage Kuralları'ndaki ilgili öncelikleri için aşağıdaki tabloyu referans olarak kullanın.
Rastgele ifadeler a
ve b
verildiğinde, bir f
alanı ve bir i
indeksi.
Şebeke | Tanım | ilişkilendirilebilirlik |
---|---|---|
a[i] a() af | Dizin, çağrı, saha erişimi | soldan sağa | !a -a | tekli olumsuzlama | sağdan sola |
a/ba%ba*b | çarpım operatörleri | soldan sağa |
a+b ab | Katkı operatörleri | soldan sağa |
a>ba>=ba | ilişki operatörleri | soldan sağa |
a in b | Listede veya haritada bulunma | soldan sağa |
a is type | Türün bool, int, float, sayı, dizi, liste, harita, zaman damgası, süre, yol veya latlng olabileceği type karşılaştırması | soldan sağa |
a==ba!=b | Karşılaştırma işleçleri | soldan sağa | a && b | koşullu VE | soldan sağa |
a || b | koşullu VEYA | soldan sağa |
a ? true_value : false_value | üçlü ifade | soldan sağa |
Gerçek Zamanlı Veritabanı
Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir mantıksal ifadedir. Bu koşulları Gerçek Zamanlı Veritabanı Kurallarında aşağıdaki şekillerde tanımlayabilirsiniz.
Önceden tanımlanmış değişkenler
Bir kural tanımından erişilebilen, önceden tanımlanmış bir dizi yararlı değişken vardır. İşte her birinin kısa bir özeti:
Önceden Tanımlanmış Değişkenler | |
---|---|
Şimdi | Linux çağından bu yana milisaniye cinsinden şimdiki zaman. Bu, SDK'nın firebase.database.ServerValue.TIMESTAMP ile oluşturulan zaman damgalarını doğrulamak için özellikle işe yarar. |
kök | Denenen işlemden önceki haliyle Firebase veritabanındaki kök yolu temsil eden bir RuleDataSnapshot . |
yeni veri | Denenen işlemden sonra var olacak verileri temsil eden bir RuleDataSnapshot . Yazılmakta olan yeni verileri ve mevcut verileri içerir. |
veri | Denenen işlemden önceki verileri temsil eden bir RuleDataSnapshot . |
$ değişkenleri | Kimlikleri ve dinamik alt anahtarları temsil etmek için kullanılan bir joker karakter yolu. |
yetki | Kimliği doğrulanmış bir kullanıcının belirteç yükünü temsil eder. |
Bu değişkenler, kurallarınızın herhangi bir yerinde kullanılabilir. Örneğin, aşağıdaki güvenlik kuralları, /foo/
düğümüne yazılan verilerin 100 karakterden az bir dizi olmasını sağlar:
{ "rules": { "foo": { // /foo is readable by the world ".read": true, // /foo is writable by the world ".write": true, // data written to /foo must be a string less than 100 characters ".validate": "newData.isString() && newData.val().length < 100" } } }
Veri tabanlı kurallar
Veritabanınızdaki herhangi bir veri, kurallarınızda kullanılabilir. Önceden tanımlı root
, data
ve newData
değişkenlerini kullanarak, bir yazma olayından önce veya sonra var olan herhangi bir yola erişebilirsiniz.
/allow_writes/
düğümünün değeri true
olduğu, üst düğümün readOnly
bayrak kümesi olmadığı ve yeni yazılan verilerde foo
adlı bir alt öğe olduğu sürece yazma işlemlerine izin veren bu örneği ele alalım:
".write": "root.child('allow_writes').val() === true && !data.parent().child('readOnly').exists() && newData.child('foo').exists()"
Sorgu tabanlı kurallar
Kuralları filtre olarak kullanamasanız da, kurallarınızdaki sorgu parametrelerini kullanarak veri alt kümelerine erişimi sınırlayabilirsiniz. query.
sorgu parametrelerine dayalı olarak okuma veya yazma erişimi vermek için kurallarınızdaki ifadeler.
Örneğin, aşağıdaki sorgu tabanlı kural, baskets
koleksiyonundaki verilere erişimi yalnızca etkin kullanıcının sahip olduğu alışveriş sepetleriyle kısıtlamak için kullanıcı tabanlı güvenlik kurallarını ve sorgu tabanlı kuralları kullanır:
"baskets": {
".read": "auth.uid !== null &&
query.orderByChild === 'owner' &&
query.equalTo === auth.uid" // restrict basket access to owner of basket
}
Kuraldaki sorgu parametrelerini içeren aşağıdaki sorgu başarılı olur:
db.ref("baskets").orderByChild("owner")
.equalTo(auth.currentUser.uid)
.on("value", cb) // Would succeed
Ancak, kuraldaki parametreleri içermeyen sorgular bir PermissionDenied
hatasıyla başarısız olur:
db.ref("baskets").on("value", cb) // Would fail with PermissionDenied
Bir istemcinin okuma işlemleri aracılığıyla ne kadar veri indireceğini sınırlamak için sorgu tabanlı kuralları da kullanabilirsiniz.
Örneğin, aşağıdaki kural okuma erişimini önceliğe göre sıralandığı şekilde bir sorgunun yalnızca ilk 1000 sonucuna sınırlar:
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example queries:
db.ref("messages").on("value", cb) // Would fail with PermissionDenied
db.ref("messages").limitToFirst(1000)
.on("value", cb) // Would succeed (default order by key)
Aşağıdaki query.
ifadeler, Gerçek Zamanlı Veritabanı Güvenlik Kurallarında mevcuttur.
Sorgu tabanlı kural ifadeleri | ||
---|---|---|
İfade | Tip | Tanım |
sorgu.orderByKey sorgu.orderByPriority query.orderByValue | mantıksal | Anahtar, öncelik veya değere göre sıralanan sorgular için doğrudur. Aksi takdirde yanlış. |
sorgu.orderByChild | sicim hükümsüz | Bir alt düğüme giden göreli yolu temsil etmek için bir dize kullanın. Örneğin, query.orderByChild === "address/zip" . Sorgu bir alt düğüm tarafından sıralanmamışsa, bu değer boştur. |
sorgu.startAt sorgu.sonAt sorgu.eşit | sicim sayı mantıksal hükümsüz | Yürütülen sorgunun sınırlarını alır veya sınır kümesi yoksa null değerini döndürür. |
sorgu.limitToFirst sorgu.limitToLast | sayı hükümsüz | Yürütülen sorgudaki sınırı alır veya ayarlanan sınır yoksa null değerini döndürür. |
Operatörler
Gerçek Zamanlı Veritabanı Kuralları, koşul ifadesindeki değişkenleri birleştirmek için kullanabileceğiniz bir dizi işleci destekler. Referans belgelerdeki işleçlerin tam listesine bakın.
Koşullar oluşturma
Gerçek koşullarınız, vermek istediğiniz erişime bağlı olarak değişecektir. Kurallar kasıtlı olarak muazzam derecede esneklik sunar, bu nedenle uygulamanızın kuralları nihayetinde ihtiyaç duyduğunuz kadar basit veya karmaşık olabilir.
Basit, üretime hazır Kurallar oluşturmaya yönelik bazı rehberlik için bkz. Temel Güvenlik Kuralları .