Firebase Security Rules

Firebase Realtime Database sikkerhetsregler er hvordan du sikrer dataene dine fra uautoriserte brukere og beskytter data strukturen.  

I denne raske tipsveiledningen vil jeg forklare hvordan du konfigurerer databasets sikkerhetsregler riktig slik at kun autoriserte brukere har lese eller skrive tilgang til data. Jeg vil også vise deg hvordan du strukturerer dataene dine for å gjøre det enkelt å sikre.

Problemet

La oss anta at vi har JSON-data i vår Firebase-database, som i eksemplet nedenfor:

"users": "user1": "firstName": "Chike", "LastName": "Mgbemena", "age": "89" "phoneNumber": "07012345678", "user2": "firstName "" Godswill "," LastName ":" Okwara "," Age ":" 12 "" phoneNumber ":" 0701234 "," user3 ": " firstName ":" Onu "," LastName ": 543," alder ": 90" telefonnummer ":" 07012345678 ", ...

Ser på databasen, kan du se at det er noen problemer med våre data:

  1. To brukere (bruker1 og bruker3) har samme telefonnummer. Vi vil at disse skal være unike.
  2. bruker3 har et nummer for etternavn, i stedet for en streng.
  3. bruker2 har bare syv siffer i telefonnummeret, i stedet for 11. 
  4. Aldersverdien for bruker1 og bruker2 er en streng, mens den av bruker3 er et tall.

Med alle disse feilene fremhevet i våre data, har vi mistet dataintegritet. I de følgende trinnene vil jeg vise deg hvordan du kan forhindre at disse forekommer. 

Tillatelsesregler

Firebase-realtidsdatabasen har følgende regeltyper:

Type Funksjon
.lese Beskriver om og når data må leses av brukerne.
.skrive Beskriv om og når data skal skrives.
.validere Definerer hva en riktig formatert verdi vil se ut, om den har barnattributter og datatypen.
.indexOn Angir et barn for å indeksere for å støtte bestilling og spørring.

Les mer om dem i Firebase docs.

Her er en veldig permissiv regel for brukere tast inn vår database. 

"regler": "brukere": // brukere kan leses av noen ".les": true, // brukere kan skrives av noen ".write": true

Dette er dårlig, fordi det gir alle muligheten til å lese eller skrive data til databasen. Alle kan få tilgang til banen / brukere / så vel som dypere stier. Ikke bare det, men ingen struktur er pålagt brukerens data.

Tilgangskontrollregler

"regler": "brukere": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", 

Med disse reglene styrer vi tilgangen til brukerdataene til innloggede brukere. Ikke bare det, men brukere kan bare lese eller skrive sine egne data. Vi gjør dette med et jokertegn: $ uid. Dette er en variabel som representerer barnnøkkelen (variabelnavn begynner med $). For eksempel, tilgang til banen / Brukere / bruker1, $ uid er "Bruker1"

Deretter bruker vi auth variabel, som representerer den nåværende autentiserte brukeren. Dette er en forhåndsdefinert servervariabel som leveres av Firebase. I linjene 5 og 6 håndhever vi en tilgjengelighetsbegrensning som bare den autentiserte brukeren med samme ID som brukeroppføringen kan lese eller skrive sine data. Med andre ord, for hver bruker, blir lese og skrive tilgang gitt til / brukere //, hvor representerer det nåværende autentiserte bruker-ID.

Andre Firebase-servervariabler er:  

Nåværende tid i millisekunder siden Linux-epoken.
rot EN RuleDataSnapshot som representerer roten banen i Firebase databasen som den eksisterer før forsøket. 
NewData EN RuleDataSnapshot som representerer dataene som det ville eksistere etter forsøket. Den inneholder de nye dataene som skrives og eksisterende data. 
data En RuleDataSnapshot representerer dataene som den eksisterte før forsøket.
auth Representerer en godkjent brukers token nyttelast.

Les mer om disse og andre servervariabler i Firebase-dokumentene.

Håndheve datastruktur

Vi kan også bruke Firebase-regler for å håndheve begrensninger på dataene i databasen vår. 

For eksempel, i følgreglene, i linjene 8 og 11, sikrer vi regler som enhver ny verdi for fornavn og etternavn må være en streng. I linje 14 sørger vi for at alder er et nummer. Til slutt, i linjene 17 og 18, håndhever vi at telefonnummerverdien må være en streng og med lengde 11.

"user": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", "firstName" : ".validate": "newData.isString ()", "LastName": ".validate": "newData.isString ()", "alder": ".validere": "newData.isNumber ) "," telefonnummer ": " .validere ":" newData.isString () && newData.val (). lengde == 11 ",

Men hvordan hindrer vi dupliserte telefonnumre?

Forebygging av duplikater

Deretter vil jeg vise deg hvordan du kan forhindre dupliserte telefonnumre.

Trinn 1: Normaliser datastrukturen

Det første vi må gjøre er å modifisere roten til å inkludere et toppnivå /telefonnummer/ node. Så, når du oppretter en ny bruker, vil vi også legge til brukerens telefonnummer til denne noden når validering er vellykket. Vår nye datastruktur vil se ut som følgende:

"users": "user1": "firstName": "Chike", "LastName": "Mgbemena", "alder": 89, "phoneNumber": "07012345678", "user2": "firstName" : "Godswill", "etternavn": "Okwara", "alder": 12, "telefonnummer": "06034345453", "user3": "firstName": "Onu", "LastName": "Emeka" alder ": 90," telefonnummer ":" 09034564543 ", ...," phoneNumbers ": " 07012345678 ":" user1 "," 06034345453 ":" user2 "," 09034564543 ":" user3 ", ... 

Trinn 2: Forbedre ny datastruktur

Vi må endre sikkerhetsreglene for å håndheve datastrukturen: 

"regler": "brukere": "$ uid": ... "phoneNumber": ".validere": "newData.isString () && newData.val (). lengde == 11 &&! root.child ('phoneNumbers'). barn (newData.val ()). eksisterer () ",

Her sørger vi for at telefonnummeret er unikt ved å sjekke om det allerede er et barn av /telefonnummer/ nod med det oppgitte telefonnummeret som nøkkel. Vi kontrollerer med andre ord at telefonnummeret ikke allerede er registrert av en bruker. Hvis den ikke har det, er validering vellykket og skrivoperasjonen vil bli akseptert ellers vil den bli avvist. 

Appen din må legge til telefonnummeret til telefonnummerlisten når du oppretter en ny bruker, og den må slette brukerens telefonnummer dersom brukeren slettes.

Simulere validering og sikkerhetsregler

Du kan simulere sikkerhetsreglene i Firebase-konsollen ved å klikke på Simulator knapp. Legg til dine sikkerhetsregler, velg typen av simulering (enten lese eller skrive), skriv inn noen data med en bane, og klikk på Løpe knapp: 

Hvis verdien av fornavnet er et tall i stedet for en streng, vil valideringen mislykkes, og skrivetilgang nektes:

Konklusjon

I denne raske tipsveiledningen har du lært om Firebase Database sikkerhetsregler: hvordan du forhindrer uautorisert tilgang til data og hvordan du sikrer at data i databasen er strukturert.

For å lære mer om Firebase Database sikkerhetsregler, se den offisielle dokumentasjonen. Og sjekk ut noen av våre andre Firebase-opplæringsprogrammer og kurs her på Envato Tuts+!