获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Poznaj podstawową składnię reguł zabezpieczeń Firebase dla języka Cloud Storage

Reguły zabezpieczeń Firebase dla Cloud Storage umożliwiają kontrolowanie dostępu do obiektów przechowywanych w zasobnikach Cloud Storage. Elastyczna składnia reguł umożliwia tworzenie reguł do kontrolowania dowolnej operacji, od wszystkich zapisów do zasobnika Cloud Storage po operacje na określonym pliku.

Ten przewodnik opisuje podstawową składnię i strukturę reguł bezpieczeństwa Cloud Storage w celu tworzenia kompletnych zestawów reguł.

Deklaracja usług i bazy danych

Reguły bezpieczeństwa Firebase dla Cloud Storage zawsze zaczynają się od następującej deklaracji:

service firebase.storage {
    // ...
}

Deklaracja service firebase.storage określa zakres reguł do Cloud Storage, zapobiegając konfliktom między regułami bezpieczeństwa Cloud Storage a regułami dla innych produktów, takich jak Cloud Firestore.

Podstawowe zasady odczytu/zapisu

Podstawowe reguły składają się z instrukcji match identyfikującej zasobniki Cloud Storage, instrukcji dopasowania określającej nazwę pliku oraz wyrażenia allow określającego, kiedy odczyt określonych danych jest dozwolony. Wyrażenia allow określają stosowane metody dostępu (np. odczyt, zapis) oraz warunki , w których dostęp jest dozwolony lub zabroniony.

W domyślnym zestawie reguł pierwsza instrukcja match korzysta z wyrażenia wieloznacznego {bucket} , aby wskazać, że reguły mają zastosowanie do wszystkich zasobników w Twoim projekcie. Omówimy ideę dopasowań wieloznacznych w następnej sekcji.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Wszystkie instrukcje dopasowania wskazują na pliki. Oświadczenie match może wskazywać na konkretny plik, tak jak w match /images/profilePhoto.png .

Dopasuj symbole wieloznaczne

Oprócz wskazywania pojedynczego pliku, Reguły mogą używać symboli wieloznacznych do wskazywania dowolnego pliku z podanym przedrostkiem w nazwie, w tym ukośnikami, jak w match /images/{imageId} .

W powyższym przykładzie instrukcja match używa składni symboli wieloznacznych {imageId} . Oznacza to, że reguła dotyczy każdego pliku z /images/ na początku jego nazwy, takiego jak /images/profilePhoto.png lub /images/croppedProfilePhoto.png . Gdy wyrażenia allow w instrukcji dopasowania zostaną ocenione, zmienna imageId zostanie rozpoznana jako nazwa pliku obrazu, na przykład profilePhoto.png lub croppedProfilePhoto.png .

Do zmiennej wieloznacznej można się odwoływać z poziomu match , aby podać nazwę pliku lub autoryzację ścieżki:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Dane hierarchiczne

Jak powiedzieliśmy wcześniej, w zasobniku Cloud Storage nie ma hierarchicznej struktury. Ale używając konwencji nazewnictwa plików, często zawierającej ukośniki w nazwach plików, możemy naśladować strukturę, która wygląda jak zagnieżdżona seria katalogów i podkatalogów. Ważne jest, aby zrozumieć, w jaki sposób reguły zabezpieczeń Firebase współdziałają z tymi nazwami plików.

Rozważ sytuację zestawu plików o nazwach, które zaczynają się od rdzenia /images/ . Reguły bezpieczeństwa Firebase mają zastosowanie tylko do pasującej nazwy pliku, więc kontrola dostępu zdefiniowana w katalogu /images/ nie ma zastosowania do katalogu /mp3s/ . Zamiast tego napisz wyraźne reguły, które pasują do różnych wzorców nazw plików:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

Podczas zagnieżdżania instrukcji match ścieżka wewnętrznej instrukcji match jest zawsze dołączana do ścieżki zewnętrznej instrukcji match . Poniższe dwa zestawy reguł są zatem równoważne:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

Rekurencyjne symbole wieloznaczne w dopasowaniu

Oprócz symboli wieloznacznych, które dopasowują i zwracają ciągi na końcu nazwy pliku, wielosegmentowy symbol wieloznaczny można zadeklarować w celu bardziej złożonego dopasowania, dodając =** do nazwy symbolu wieloznacznego, na przykład {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Jeśli do pliku pasuje wiele reguł, wynikiem jest OR wyniku wszystkich ocen reguł. Oznacza to, że jeśli jakakolwiek reguła, do której pasuje plik, ma wartość true , wynikiem jest true .

W powyższych regułach plik „images/profilePhoto.png” można odczytać, jeśli condition lub other_condition wartość true, podczas gdy plik „images/users/user:12345/profilePhoto.png” podlega tylko wynikowi other_condition .

Reguły zabezpieczeń Cloud Storage nie działają kaskadowo, a reguły są oceniane tylko wtedy, gdy ścieżka żądania jest zgodna ze ścieżką z określonymi regułami.

Wersja 1

Reguły zabezpieczeń Firebase domyślnie używają wersji 1. W wersji 1 rekurencyjne symbole wieloznaczne dopasowują jeden lub więcej elementów nazwy pliku, a nie zero lub więcej elementów. Zatem match /images/{filenamePrefixWildcard}/{imageFilename=**} pasuje do nazwy pliku, takiej jak /images/profilePics/profile.png, ale nie do /images/badge.png. Zamiast tego użyj /images/{imagePrefixorFilename=**} .

Rekurencyjne symbole wieloznaczne muszą znajdować się na końcu oświadczenia meczu.

Zalecamy korzystanie z wersji 2 ze względu na jej bardziej zaawansowane funkcje.

Wersja 2

W wersji 2 reguł zabezpieczeń Firebase rekurencyjne symbole wieloznaczne odpowiadają zero lub większej liczbie elementów ścieżki. Zatem /images/{filenamePrefixWildcard}/{imageFilename=**} pasuje do nazw plików /images/profilePics/profile.png i /images/badge.png.

Musisz wyrazić zgodę na wersję 2, dodając rules_version = '2'; u góry Twoich zasad bezpieczeństwa:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

Możesz mieć co najwyżej jeden rekurencyjny symbol wieloznaczny na instrukcję dopasowania, ale w wersji 2 możesz umieścić ten symbol wieloznaczny w dowolnym miejscu w instrukcji dopasowania. Na przykład:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

Operacje granularne

W niektórych sytuacjach przydatne jest rozbicie read i write na bardziej szczegółowe operacje. Na przykład aplikacja może chcieć wymusić inne warunki podczas tworzenia pliku niż podczas usuwania pliku.

Operację read można podzielić na get i list .

Regułę write można podzielić na create , update i delete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

Pokrywające się stwierdzenia dotyczące dopasowania

Możliwe, że nazwa pliku pasuje do więcej niż jednej instrukcji match . W przypadku, gdy wiele wyrażeń allow pasuje do żądania, dostęp jest dozwolony, jeśli którykolwiek z warunków jest true :

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

W powyższym przykładzie wszystkie odczyty i zapisy do plików, których nazwa zaczyna się od /images/ , są dozwolone, ponieważ druga reguła jest zawsze true , nawet jeśli pierwsza reguła jest false .

Reguły to nie filtry

Gdy zabezpieczysz swoje dane i zaczniesz wykonywać operacje na plikach, pamiętaj, że reguły bezpieczeństwa nie są filtrami. Nie możesz wykonywać operacji na zbiorze plików pasującym do wzorca nazwy pliku i oczekiwać, że Cloud Storage będzie mieć dostęp tylko do plików, do których bieżący klient ma uprawnienia dostępu.

Weźmy na przykład następującą regułę bezpieczeństwa:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

Odmowa : ta reguła odrzuca następujące żądanie, ponieważ zestaw wyników może zawierać pliki, w których contentType nie jest image/png :

Sieć
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

Reguły w Cloud Storage Reguły bezpieczeństwa oceniają każde zapytanie pod kątem jego potencjalnego wyniku i kończy się niepowodzeniem, jeśli może zwrócić plik, do którego klient nie ma uprawnień do odczytu. Żądania dostępu muszą być zgodne z ograniczeniami określonymi przez Twoje reguły.

Następne kroki

Możesz pogłębić swoją wiedzę na temat reguł zabezpieczeń Firebase dla Cloud Storage:

  • Poznaj następną główną koncepcję języka Reguł, warunków dynamicznych , które umożliwiają Reguły sprawdzanie autoryzacji użytkowników, porównywanie istniejących i przychodzących danych, weryfikowanie danych przychodzących i nie tylko.

  • Przejrzyj typowe przypadki użycia zabezpieczeń oraz definicje reguł zabezpieczeń Firebase, które je dotyczą .

Możesz poznać przypadki użycia reguł zabezpieczeń Firebase specyficzne dla Cloud Storage: