Omówienie reguł zabezpieczeń Bazy danych czasu rzeczywistego Firebase

Reguły zabezpieczeń Bazy danych czasu rzeczywistego Firebase określają, kto ma uprawnienia do odczytu i zapisu w bazie danych, jaka jest struktura danych i jakie indeksy istnieją. Te reguły są przechowywane na serwerach Firebase i są egzekwowane automatycznie przez cały czas. Każde żądanie odczytu i zapisu zostanie zrealizowane tylko wtedy, gdy zezwalają na to reguły. Domyślnie reguły nie zezwalają nikomu na dostęp do Twojej bazy danych. Ma to na celu ochronę bazy danych przed nadużyciami, dopóki nie uda Ci się dostosować reguł lub skonfigurować uwierzytelniania.

Reguły zabezpieczeń Bazy danych czasu rzeczywistego mają składnię podobną do JavaScript i występują w 4 typach:

Typy reguł
.read Określa, czy i kiedy użytkownicy mogą odczytywać dane.
.write Określa, czy i kiedy można zapisywać dane.
.validate, Określa, jak będzie wyglądać poprawnie sformatowana wartość, czy ma atrybuty podrzędne i typ danych.
indexOn, Określa element podrzędny do zindeksowania, aby umożliwić sortowanie i wyszukiwanie.

Realtime Database omówienie zabezpieczeń

Firebase Realtime Database udostępnia pełny zestaw narzędzi do zarządzania bezpieczeństwem aplikacji. Dzięki tym narzędziom możesz łatwo uwierzytelniać użytkowników, egzekwować ich uprawnienia i weryfikować dane wejściowe.

Aplikacje oparte na Firebase uruchamiają więcej kodu po stronie klienta niż aplikacje korzystające z wielu innych zbiorów technologii. Dlatego podchodzimy do bezpieczeństwa w inny sposób niż zwykle.

Uwierzytelnianie

Pierwszym krokiem w zabezpieczeniu aplikacji jest zwykle identyfikacja użytkowników. Ten proces jest nazywany uwierzytelnianiem. Aby umożliwić użytkownikom logowanie się w aplikacji, możesz użyć usługi Uwierzytelnianie Firebase. Usługa ta obsługuje popularne metody uwierzytelniania, takie jak Google i Facebook, a także logowanie się za pomocą adresu e-mail i hasła oraz logowanie anonimowe.

Tożsamość użytkownika jest ważną koncepcją bezpieczeństwa. Różni użytkownicy mają inne dane i czasami inne możliwości. Na przykład w aplikacji do czatu każda wiadomość jest powiązana z użytkownikiem, który ją utworzył. Użytkownicy mogą też usuwać własne wiadomości, ale nie wiadomości opublikowane przez innych użytkowników.

Autoryzacja

Identyfikacja użytkownika to tylko część zabezpieczeń. Gdy już je poznasz, musisz mieć możliwość kontrolowania ich dostępu do danych w Twojej bazie danych. Reguły zabezpieczeń Bazy danych czasu rzeczywistego umożliwiają kontrolowanie dostępu poszczególnych użytkowników. Oto na przykład zestaw reguł zabezpieczeń, który zezwala każdemu na odczyt ścieżki /foo/, ale nie zezwala na zapisywanie w niej:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Reguły .read.write działają kaskadowo, więc ten zestaw zasad przyznaje dostęp z możliwością odczytu do wszystkich danych na ścieżce /foo/, a także do wszystkich ścieżek głębszych, takich jak /foo/bar/baz. Pamiętaj, że reguły .read i .write znajdujące się wyżej w bazie danych zastępują reguły znajdujące się niżej, więc w tym przykładzie dostęp do funkcji odczytu /foo/bar/baz nadal byłby przyznawany, nawet jeśli reguła na ścieżce /foo/bar/baz zostałaby oceniona jako fałszywa.

Reguły zabezpieczeń bazy danych czasu rzeczywistego obejmują zmienne wbudowane i funkcje, które umożliwiają odwoływanie się do innych ścieżek, sygnatur czasowych po stronie serwera, informacji uwierzytelniających i nie tylko. Oto przykład reguły, która przyznaje uwierzytelnionym użytkownikom dostęp do funkcji /users/<uid>/. W tym przypadku parametr <uid> to identyfikator użytkownika uzyskany za pomocą funkcji Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Walidacja danych

Element Firebase Realtime Database nie zawiera schematu. Dzięki temu możesz łatwo wprowadzać zmiany w trakcie tworzenia aplikacji, ale gdy aplikacja będzie gotowa do dystrybucji, ważne jest, aby dane były spójne. Język reguł zawiera regułę .validate, która umożliwia zastosowanie logiki walidacji za pomocą tych samych wyrażeń, które są używane w regułach .read i .write. Jedyną różnicą jest to, że reguły walidacji nie działają kaskadowo, więc aby zapis był dozwolony, wszystkie odpowiednie reguły walidacji muszą zwracać wartość „prawda”.

Te reguły wymagają, aby dane zapisane w polu /foo/ były ciągiem znaków o długości nieprzekraczającej 100 znaków:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Reguły weryfikacji mają dostęp do wszystkich wbudowanych funkcji i zmiennych co reguły .read i .write. Możesz ich używać do tworzenia reguł walidacji, które uwzględniają dane z innych miejsc w Twojej bazie danych, tożsamość użytkownika, czas serwera i wiele innych informacji.

Definiowanie indeksów baz danych

Interfejs Firebase Realtime Database umożliwia porządkowanie danych i wykonywanie na nich zapytań. W przypadku małych zbiorów danych baza danych obsługuje zapytania doraźne, więc indeksy nie są zwykle wymagane podczas tworzenia. Zanim jednak uruchomisz aplikację, musisz określić indeksy dla wszystkich tworzonych zapytań, aby mieć pewność, że będą one nadal działać w miarę rozwoju aplikacji.

Indeksy są określane za pomocą reguły .indexOn. Oto przykład deklaracji indeksu, która indeksuje pola height i length w przypadku listy dinozaurów:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Dalsze kroki