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

Reguły zabezpieczeń Firebase Realtime Database określają, kto ma dostęp do odczytu i zapisu do Twojej bazy danych, jak są ustrukturyzowane Twoje dane i jakie istnieją indeksy. Te reguły są dostępne na serwerach Firebase i są egzekwowane automatycznie przez cały czas. Każde żądanie odczytu i zapisu zostanie zrealizowane tylko wtedy, gdy Twoje reguły na to zezwalają. 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 nasz sposób podejścia do bezpieczeństwa może być nieco inny niż ten, do którego jesteś przyzwyczajony.

Uwierzytelnianie

Pierwszym krokiem w zabezpieczeniu aplikacji jest zwykle identyfikacja użytkowników. Ten proces nazywa się 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ą różne dane i czasami różne 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 bezpieczeństwa w Realtime Database zawierają wbudowane zmienne i funkcje, które umożliwiają odwoływanie się do innych ścieżek, sygnatur czasowych po stronie serwera, informacji uwierzytelniających i innych danych. Oto przykład reguły, która przyznaje uwierzytelnionym użytkownikom dostęp do zasobu /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 ma 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 walidacji mają dostęp do tych samych wbudowanych funkcji i zmiennych co reguły .read.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

Firebase Realtime Database umożliwia sortowanie i wysyłanie zapytań dotyczących danych. 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 zapytań, aby mieć pewność, że będą one nadal działać, gdy aplikacja się rozrośnie.

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