firestore: PERMISSION_DENIED: brakujące lub niewystarczające uprawnienia


125

Otrzymuję błąd

uzyskiwaniedocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: brak uprawnień lub niewystarczające uprawnienia.

dla poniższego kodu w instrukcji else

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 for (DocumentSnapshot document : task.getResult()) {
                     s(document.getId() + " => " + document.getData());
                 }
             } else {
                 s("Error getting documents."+ task.getException());
             }
         }
     });

Czy użytkownik jest zalogowany?
Suhayl SH

4
Czy ustawiłeś reguły na karcie Zabezpieczenia w konsoli Firebase?
Suhayl SH

1
Mój błąd, nie widziałem skrzynki wrzutowej dla magazynu chmur. Sprawdzałem tylko w bazie danych czasu rzeczywistego.
S Rekhu,

dzięki @SuhaylSH
S Rekhu

Odpowiedzi:


181

U mnie to po prostu działa.

Przejdź do Bazy danych -> Reguły ->

Zmień allow read, write: if fałsz; do prawdy;

Uwaga: To całkowicie wyłącza zabezpieczenia bazy danych!

Umożliwianie zapisu na całym świecie bez uwierzytelniania !!! To NIE jest rozwiązanie zalecane dla środowiska produkcyjnego. Używaj tego tylko do celów testowych.


44
pamiętaj, że umożliwia to każdemu czytanie i pisanie bazy danych bez żadnego upoważnienia.
Sai Gopi Me

109
To okropne rozwiązanie, które dosłownie wyłącza zabezpieczenia. Zamiast tego przeczytaj to: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu, ponieważ to działa dla wszystkich
Luvnish Monga

11
Jak powiedział @DuncanLuk, to straszne rozwiązanie. Nie nazwałbym tego nawet rozwiązaniem
Ojonugwa Jude Ochalifu

6
Najlepsze rozwiązanie, aby zacząć naprawdę szybko. W rzeczywistości problemy związane z bezpieczeństwem można rozwiązać później.
Viacheslav Dobromyslov

79

Idź do Baza danych -> Reguły :

Następnie zmieniono poniżej zasady

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

poniżej

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

9
To zły pomysł, to sprawia, że ​​WSZYSTKIE dokumenty mogą być zapisywane przez KAŻDEGO uwierzytelnionego użytkownika, nawet te, które należą do innych użytkowników, rzeczy, które powinny być zapisywane tylko przez administratora lub nigdy nie były zapisywalne. Zachowaj pierwszy fragment kodu, ponieważ chroni przed niezaimplementowanymi regułami bezpieczeństwa.
Noxxys

1
Pamiętaj, że jeśli pozwolisz innym zarejestrować się (na przykład za pomocą logowania jednokrotnego Google), automatycznie uzyskają one dostęp do wszystkich Twoich danych.
ForrestLyman

2
Chcę umożliwić moim uwierzytelnionym użytkownikom (niewielkiej liczbie) dostęp do wszystkich dokumentów, więc ten przepis jest idealny dla mojej sprawy.
AFD

20

Więc w moim przypadku miałem następujące zasady DB:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{story} {
      function isSignedIn() {
        return request.auth.uid != null;
      }
    
      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

Jak widać uidna storydokumencie znajduje się pole do oznaczenia właściciela.

Następnie w swoim kodzie odpytywałem wszystkie historie (Flutter):

Firestore.instance
          .collection('stories')
          .snapshots()

I nie udało się, ponieważ dodałem już kilka historii za pośrednictwem różnych użytkowników. Aby to naprawić, musisz dodać warunek do zapytania:

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

Więcej szczegółów tutaj: https://firebase.google.com/docs/firestore/security/rules-query

EDYCJA: z linku

Reguły nie są filtrami Pisząc zapytania w celu pobrania dokumentów, należy pamiętać, że reguły bezpieczeństwa nie są filtrami - zapytania to wszystko albo nic. Aby zaoszczędzić czas i zasoby, Cloud Firestore ocenia zapytanie pod kątem potencjalnego zestawu wyników zamiast rzeczywistych wartości pól dla wszystkich Twoich dokumentów. Jeśli zapytanie mogłoby potencjalnie zwrócić dokumenty, do których odczytu klient nie ma uprawnień, całe żądanie kończy się niepowodzeniem.


czym jest obiekt użytkownika?
Phani Rithvij

To najlepsza odpowiedź
Elia Weiss

13

Powyższe głosowane odpowiedzi są niebezpieczne dla zdrowia Twojej bazy danych. Nadal możesz udostępnić swoją bazę danych tylko do czytania, a nie do pisania:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}

1
jaki jest właściwy sposób włączania uprawnień, ale nie dla wszystkich?
nyxee

8

Jeśli spróbujesz w aplikacji Java Swing.

  1. Idź do Firebase Console> Project Overview>Project Settings

  2. Następnie przejdź do zakładki Service Accounts, a następnie kliknij Generate New Private Key.

  3. Otrzymasz plik .json, umieść go w znanej ścieżce

  4. Następnie przejdź do Właściwości mojego komputera, Zaawansowane ustawienia systemu, Zmienne środowiskowe.

  5. Utwórz nową GOOGLE_APPLICATION_CREDENTIALSwartość zmiennej ścieżki ze ścieżką do pliku JSON.


To był mój problem też tam informacje na ten temat na docs .
tris timb

5

npm i --save firebase @ angular / fire

w module app.module upewnij się, że został zaimportowany

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';

w imporcie

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

w regułach bazy danych czasu rzeczywistego upewnij się, że masz

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

w regułach Cloud Firestore upewnij się, że masz

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

3

upewnij się, że twoja baza danych nie jest pusta, ani twoje zapytanie nie dotyczy kolekcji, której nie ma


9
Ten wyjątek nie ma nic wspólnego z pustą kolekcją lub
bazą danych

Ten wyjątek nie ma nic wspólnego z pustą bazą danych itp. Problem z regułami bezpieczeństwa i uwierzytelnianiem.
Rehan Ali

Ja i co najmniej 3 inne osoby mają ten wyjątek w tym scenariuszu. Jeśli to ci nie pomoże, przejdź do następnego rozwiązania
itzhar

3

Dodatkowo możesz otrzymać ten błąd, jeśli odwołanie do kolekcji w Twoim kodzie nie pasuje do nazwy kolekcji w Firebase.

Na przykład nazwa kolekcji w firebase to users, ale odwołujesz się do niej za pomocą db.collection("Users")lubdb.collection("user")

Rozróżniana jest również wielkość liter.

Mam nadzieję, że to komuś pomoże


Czy kolekcja nie jest tworzona niejawnie? W Twoim przykładzie kolekcja „Użytkownicy” i „użytkownik” zostanie utworzona w momencie odniesienia do niej.
bdev TJ


@DevTJ masz rację, gdy jest to żądanie addlub set, ale z pytania jest to getżądanie. Doświadczyłem tego już wcześniej
Anga


2

Jeśli ktoś wyląduje tutaj, próbując uzyskać dostęp do Firestore za pomocą konta usługi:

Rozwiązałem ten problem, przyznając kontu usługi Service Account Userrolę oprócz Cloud Datastore Userroli w ustawieniach uprawnień GCP.


2

Obecnie, czerwiec 2020 r., Domyślnie firebase jest definiowany według czasu. Określ czas, w którym spełnisz swoje potrzeby.

allow read, write: if request.time < timestamp.date(2020, 7, 10);

Uwaga: Twoja baza danych nadal jest otwarta dla każdego. Proponuję zapoznać się z dokumentacją i skonfigurować DB w sposób, który jest dla Ciebie przydatny.


1

problem polega na tym, że próbowałeś odczytać lub zapisać dane w bazie danych czasu rzeczywistego lub w magazynie firestore, zanim użytkownik zostanie uwierzytelniony. spróbuj sprawdzić zakres swojego kodu. mam nadzieję, że pomogło!



1

Dla mnie był to problem z datą. Zaktualizowałem go i problem został rozwiązany.

Zezwalaj na odczyt / zapis:

 if request.time < timestamp.date(2020, 5, 21);

Edycja: jeśli nadal jesteś zdezorientowany i nie możesz dowiedzieć się, na czym polega problem, po prostu zapoznaj się z sekcją reguł w konsoli Firebase.


1

termin może się skończyć

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020,7, 1);
    }
  }
}

tam zmienić datę dzisiaj w tej linii:

 allow read, write: if request.time < timestamp.date(2020,7, 1);

0

PRZEJDŹ do reguł w firebase i edytuj reguły ..... (podaj sygnaturę czasową lub ustaw fałsz) Moje rozwiązanie.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2021, 8, 18);
    }
  }
}


-1

Twoje zasady powinny być takie w tym przypadku, jednak komunikat mówi, że nie jest to sugerowany sposób, ale jeśli to zrobisz, możesz zrobić wstawienia bez błędu uprawnień

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.