Firebase Security Rules zapewniają kontrolę dostępu i weryfikację danych w formacie, który obsługuje wiele poziomów złożoności. Aby utworzyć systemy dostępu oparte na użytkownikach i rolach, które zapewniają bezpieczeństwo danych użytkowników, użyj Firebase Authentication z Firebase Security Rules.
Identyfikowanie użytkowników
Authentication identyfikuje użytkowników, którzy proszą o dostęp do Twoich danych, i udostępnia te informacje jako zmienną, którą możesz wykorzystać w swoich regułach. Zmienna auth zawiera te informacje:
uid: unikalny identyfikator użytkownika przypisany do użytkownika wysyłającego żądanie.token: mapa wartości zebranych przez Authentication.
Zmienna auth.token zawiera te wartości:
| Pole | Opis |
|---|---|
email |
Adres e-mail powiązany z kontem (jeśli jest dostępny). |
email_verified |
true, jeśli użytkownik potwierdził, że ma dostęp do adresu email. Niektórzy dostawcy automatycznie weryfikują adresy e-mail, które do nich należą. |
phone_number |
numer telefonu powiązany z kontem (jeśli jest dostępny); |
name |
Wyświetlana nazwa użytkownika, jeśli została ustawiona. |
sub |
Identyfikator UID użytkownika w Firebase. Jest unikalny w obrębie projektu. |
firebase.identities |
Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Klucze słownika mogą być dowolnymi z tych wartości: email, phone, google.com, facebook.com, github.com, twitter.com. Wartości słownika to tablice unikalnych identyfikatorów 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żyty do uzyskania tego tokena. Może być jednym z tych ciągów znaków: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com. |
firebase.tenant |
Identyfikator najemcy powiązany z kontem, jeśli jest dostępny, np. tenant2-m6tyz. |
Jeśli chcesz dodać niestandardowe atrybuty uwierzytelniania, zmienna auth.token zawiera też określone przez Ciebie deklaracje niestandardowe.
Jeśli użytkownik, który prosi o dostęp, nie jest zalogowany, zmienna auth ma wartość null.
Możesz to wykorzystać w regułach, jeśli na przykład chcesz ograniczyć dostęp do odczytu do uwierzytelnionych użytkowników – auth != null. Zalecamy jednak dalsze ograniczenie dostępu do zapisu.
Więcej informacji o zmiennej auth znajdziesz w dokumentacji referencyjnej dotyczącej Cloud Firestore, Realtime Database i Cloud Storage.
Wykorzystywanie informacji o użytkownikach w regułach
W praktyce używanie uwierzytelnionych informacji w regułach sprawia, że są one bardziej skuteczne i elastyczne. Możesz kontrolować dostęp do danych na podstawie tożsamości użytkownika.
W regułach określ, jak informacje w zmiennej auth (informacje o użytkowniku, który wysyła żądanie) pasują do informacji o użytkowniku powiązanych z żądanymi danymi.
Na przykład aplikacja może chcieć mieć pewność, że użytkownicy mogą odczytywać i zapisywać tylko własne dane. W takim przypadku chcesz dopasować zmienną auth.uid do identyfikatora użytkownika w żądanych danych:
Cloud 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;
}
}
}
Realtime Database
{
"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"
}
}
}
}
Cloud Storage
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;
}
}
Definiowanie niestandardowych informacji o użytkowniku
Możesz też użyć zmiennej auth, aby zdefiniować pola niestandardowe przypisane do użytkowników aplikacji.
Załóżmy na przykład, że chcesz utworzyć rolę „administratora”, która umożliwia dostęp do zapisu w określonych ścieżkach. Możesz przypisać 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ć pole niestandardowe do dokumentów użytkowników i pobrać jego wartość za pomocą wbudowanego odczytu w regułach. Reguła oparta na uprawnieniach administratora będzie wyglądać tak:
Cloud 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 niestandardowych deklaracji tożsamości w Security Rules możesz uzyskać po utworzeniu niestandardowych deklaracji tożsamości w Authentication. Następnie możesz odwoływać się do tych niestandardowych deklaracji za pomocą zmiennej auth.token.
Cloud 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";
}
}
}
Realtime Database
{
"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"
}
}
}
}
Cloud Storage
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ł Security Rules wykorzystujących Authentication znajdziesz w artykule Podstawowe reguły zabezpieczeń.