Reguły bezpieczeństwa Firebase zapewniają kontrolę dostępu i sprawdzanie poprawności danych w formacie obsługującym wiele poziomów złożoności. Aby zbudować systemy dostępu oparte na użytkownikach i rolach, które zapewnią bezpieczeństwo danych użytkowników, użyj uwierzytelniania Firebase z regułami bezpieczeństwa Firebase.
Identyfikuj użytkowników
Uwierzytelnianie identyfikuje użytkowników żądających dostępu do Twoich danych i udostępnia te informacje jako zmienną, którą możesz wykorzystać w swoich regułach. Zmienna auth
zawiera następujące informacje:
-
uid
: Unikalny identyfikator użytkownika przypisany do użytkownika żądającego. -
token
: Mapa wartości zebranych przez uwierzytelnianie.
Zmienna auth.token
zawiera następujące wartości:
Pole | Opis |
---|---|
email | Adres e-mail powiązany z kontem, jeśli istnieje. |
email_verified | true , jeśli użytkownik potwierdził, że ma dostęp do adresu email . Niektórzy dostawcy automatycznie weryfikują posiadane adresy e-mail. |
phone_number | Numer telefonu powiązany z kontem, jeśli jest obecny. |
name | Nazwa wyświetlana użytkownika, jeśli jest ustawiona. |
sub | Identyfikator UID Firebase użytkownika. Jest to unikalne rozwiązanie w ramach projektu. |
firebase.identities | Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Kluczami słownika mogą być dowolne z następujących: email , phone , google.com , facebook.com , github.com , twitter.com . Wartości słownika to tablice unikalnych identyfikatorów dla każdego dostawcy tożsamości powiązanego z kontem. Na przykład auth.token.firebase.identities["google.com"][0] zawiera pierwszy identyfikator użytkownika Google powiązany z kontem. |
firebase.sign_in_provider | Dostawca logowania używany do uzyskania tego tokenu. Może to być jeden z następujących ciągów: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | Identyfikator najemcy powiązany z kontem, jeśli istnieje. np. tenant2-m6tyz |
Jeśli chcesz dodać dostosowane atrybuty uwierzytelniania, zmienna auth.token
zawiera również wszelkie określone niestandardowe oświadczenia .
Gdy użytkownik żądający dostępu nie jest zalogowany, zmienna auth
ma wartość null
. Możesz wykorzystać to w swoich regułach, jeśli na przykład chcesz ograniczyć dostęp do odczytu do uwierzytelnionych użytkowników — auth != null
. Jednak ogólnie zalecamy dalsze ograniczenie dostępu do zapisu.
Więcej informacji na temat zmiennej auth
znajdziesz w dokumentacji referencyjnej Cloud Firestore , Realtime Database i Cloud Storage .
Wykorzystaj informacje o użytkowniku w regułach
W praktyce użycie uwierzytelnionych informacji w regułach sprawia, że reguły są potężniejsze i bardziej elastyczne. Możesz kontrolować dostęp do danych na podstawie tożsamości użytkownika.
W swoich regułach zdefiniuj, w jaki sposób informacje zawarte w zmiennej auth
— informacje o użytkowniku osoby żądającej — odpowiadają informacjom użytkownika powiązanym z żądanymi danymi.
Na przykład Twoja aplikacja może chcieć mieć pewność, że użytkownicy będą mogli tylko odczytywać i zapisywać własne dane. W tym scenariuszu potrzebne byłoby dopasowanie zmiennej auth.uid
do identyfikatora użytkownika w żądanych danych:
Chmura Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Baza danych czasu rzeczywistego
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
Magazyn w chmurze
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
Zdefiniuj niestandardowe informacje o użytkowniku
Możesz dodatkowo wykorzystać zmienną auth
do zdefiniowania niestandardowych pól przypisanych do użytkowników aplikacji.
Załóżmy na przykład, że chcesz utworzyć rolę „administratora”, która umożliwi zapis w określonych ścieżkach. Przypisałbyś ten atrybut użytkownikom, a następnie wykorzystał go w regułach przyznających dostęp do ścieżek.
W Cloud Firestore możesz dodać niestandardowe pole do dokumentów użytkowników i pobrać wartość tego pola za pomocą osadzonego odczytu w regułach. Zatem reguła oparta na administratorze wyglądałaby jak w następującym przykładzie:
Chmura Firestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
Dostęp do oświadczeń niestandardowych można uzyskać w Regułach po utworzeniu oświadczeń niestandardowych w obszarze Uwierzytelnianie. Następnie możesz odwoływać się do tych niestandardowych oświadczeń, używając zmiennej auth.token
.
Chmura Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Baza danych czasu rzeczywistego
{
"rules": {
"some_path/$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true"
".read": "auth.uid !== null"
}
}
}
Magazyn w chmurze
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
Więcej przykładów podstawowych reguł wykorzystujących uwierzytelnianie można znaleźć w artykule Podstawowe reguły zabezpieczeń .