firestore: PERMISSION_DENIED: Fehlende oder unzureichende Berechtigungen

117

Ich erhalte den Fehler

Gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Fehlende oder unzureichende Berechtigungen.

für den folgenden Code auf else-Anweisung

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());
             }
         }
     });
S Rekhu
quelle
Ist der Benutzer angemeldet?
Suhayl SH
4
Haben Sie die Regeln auf der Registerkarte "Sicherheit" in der Firebase-Konsole festgelegt?
Suhayl SH
1
Mein Fehler, ich habe die Dropbox für den Cloud Firestore nicht gesehen. Ich habe nur in der Echtzeitdatenbank eingecheckt.
S Rekhu
danke @SuhaylSH
S Rekhu

Antworten:

168

Es funktioniert einfach bei mir.

Gehen Sie in Datenbank -> Regeln ->

allow read, write: if Falsch ändern ; zu wahr;

Hinweis: Dadurch wird die Sicherheit für die Datenbank vollständig deaktiviert!

Die Welt ohne Authentifizierung beschreibbar machen !!! Dies ist KEINE Lösung, die für eine Produktionsumgebung empfohlen werden kann. Verwenden Sie dies nur zu Testzwecken.

Luvnish Monga
quelle
42
Beachten Sie, dass jeder Ihre Datenbank ohne Genehmigung lesen und schreiben kann.
Sai Gopi Me
100
Dies ist eine schreckliche Lösung, die die Sicherheit buchstäblich nur deaktiviert. Lesen Sie stattdessen Folgendes
Duncan Luk
2
@ojonugwaochalifu, weil dies für alle funktioniert
Luvnish Monga
11
Wie @DuncanLuk sagte, ist es eine schreckliche Lösung. Ich würde es nicht einmal eine Lösung nennen
Ojonugwa Jude Ochalifu
6
Beste Lösung, um schnell loszulegen. Sicherheitsbedenken könnten später tatsächlich behoben werden.
Viacheslav Dobromyslov
75

Gehen Sie zu Datenbank -> Regeln :

Dann unten Regeln geändert

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

nach unten

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
Md Nakibul Hassan
quelle
8
Dies ist eine schlechte Idee. Dadurch können ALLE Dokumente von JEDEM authentifizierten Benutzer beschreibbar sein, auch solche, die anderen Benutzern gehören. Diese sollten nur vom Administrator oder überhaupt nicht beschreibbar sein. Bitte bewahren Sie den ersten Code auf, da er vor nicht implementierten Sicherheitsregeln schützt.
Noxxys
1
Beachten Sie, dass Personen, die sich anmelden (z. B. bei Google SSO), automatisch auf alle Ihre Daten zugreifen können.
ForrestLyman
2
Ich möchte meinen authentifizierten Benutzern (einer kleinen Anzahl) den Zugriff auf alle Dokumente ermöglichen, daher ist dieses Rezept perfekt für meinen Fall.
AFD
1
Dies sollte die akzeptierte Antwort sein.
Ishaan
18

In meinem Fall hatte ich also die folgenden DB-Regeln:

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
    }
  }
}

Wie Sie sehen, befindet sich uidauf dem storyDokument ein Feld, in dem der Eigentümer markiert ist.

Dann habe ich in meinem Code alle Geschichten abgefragt (Flutter):

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

Und es ist fehlgeschlagen, weil ich bereits einige Geschichten über verschiedene Benutzer hinzugefügt habe. Um dies zu beheben, müssen Sie der Abfrage eine Bedingung hinzufügen:

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

Weitere Details finden Sie hier: https://firebase.google.com/docs/firestore/security/rules-query

BEARBEITEN: über den Link

Regeln sind keine Filter Beachten Sie beim Schreiben von Abfragen zum Abrufen von Dokumenten, dass Sicherheitsregeln keine Filter sind - Abfragen sind alles oder nichts. Um Ihnen Zeit und Ressourcen zu sparen, bewertet Cloud Firestore eine Abfrage anhand ihrer potenziellen Ergebnismenge anstelle der tatsächlichen Feldwerte für alle Ihre Dokumente. Wenn eine Abfrage möglicherweise Dokumente zurückgibt, für die der Client keine Leseberechtigung hat, schlägt die gesamte Anforderung fehl.

rwozniak
quelle
Was ist das Benutzerobjekt?
Phani Rithvij
Dies ist die beste Antwort
Elia Weiss
11

Die oben genannten Antworten sind gefährlich für die Gesundheit Ihrer Datenbank. Sie können Ihre Datenbank weiterhin nur zum Lesen und nicht zum Schreiben zur Verfügung stellen:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
Ssubrat Rrudra
quelle
1
Was ist der richtige Weg, um die Berechtigungen zu aktivieren, aber nicht für alle?
Nyxee
7

Wenn Sie es in Java Swing Application versuchen.

  1. Gehe zu Firebase Console> Project Overview>Project Settings

  2. Gehen Sie dann zur Registerkarte Dienstkonten und klicken Sie dann auf Neuen privaten Schlüssel generieren.

  3. Sie erhalten eine .json-Datei, die Sie in einem bekannten Pfad ablegen

  4. Gehen Sie dann zu Arbeitsplatzeigenschaften, Erweiterte Systemeinstellungen, Umgebungsvariablen.

  5. Erstellen Sie einen neuen Pfadvariablenwert GOOGLE_APPLICATION_CREDENTIALSmit Ihrem Pfad zur JSON-Datei.

Nadun Liyanage
quelle
Dies war auch mein Problem, Informationen dazu finden Sie in den Dokumenten .
Tris Timb
4

npm i - save firebase @ angle / fire

Stellen Sie in app.module sicher, dass Sie importiert haben

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

bei Importen

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

Stellen Sie in Echtzeit-Datenbankregeln sicher, dass Sie haben

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

Stellen Sie in Cloud Firestore-Regeln sicher, dass Sie haben

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

Stellen Sie sicher, dass Ihre Datenbank nicht leer ist und Ihre Abfrage keine Sammlung enthält, die nicht vorhanden ist

itzhar
quelle
6
Diese Ausnahme hat nichts mit leerer Sammlung oder
Datenbank
Diese Ausnahme hat nichts mit leerer Datenbank usw. zu tun. Problem mit Sicherheitsregeln und Auth.
Rehan Ali
Ich und mindestens 3 andere haben diese Ausnahme in diesem Szenario. Wenn es Ihnen nicht hilft, fahren Sie mit der nächsten Lösung fort
itzhar
1

Außerdem kann dieser Fehler auftreten, wenn die Sammlungsreferenz aus Ihrem Code nicht mit dem Sammlungsnamen in Firebase übereinstimmt.

Zum Beispiel ist der Sammlungsname auf Firebase users, aber Sie verweisen mit db.collection("Users")oder auf ihndb.collection("user")

Es wird auch zwischen Groß- und Kleinschreibung unterschieden.

Hoffe das hilft jemandem

Anga
quelle
Wird die Sammlung nicht implizit erstellt? In Ihrem Beispiel werden die Sammlungen "Benutzer" und "Benutzer" erstellt, sobald darauf verwiesen wird.
Bdev TJ
Informationen finden Sie hier. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ
@ DevTJ Sie haben Recht, wenn es eine addoder setAnfrage ist, aber von der Frage ist es eine getAnfrage. Ich habe das schon einmal erlebt
Anga
1

Wenn hier jemand landet und versucht, mit einem Dienstkonto auf Firestore zuzugreifen:

Ich habe dieses Problem gelöst, indem ich dem Dienstkonto Service Account Userzusätzlich zu der Cloud Datastore UserRolle in den IAM-Einstellungen von GCP die Rolle zugewiesen habe.

maxarndt
quelle
1

Zu diesem Zeitpunkt, Juni 2020, wird die Feuerbasis standardmäßig nach Zeit definiert. Definieren Sie die Zeit, um Ihre Anforderungen zu erfüllen.

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

Das Problem ist, dass Sie versucht haben, Daten in eine Echtzeitdatenbank oder einen Firestore zu lesen oder zu schreiben, bevor der Benutzer authentifiziert wurde. Bitte versuchen Sie, den Umfang Ihres Codes zu überprüfen. hoffe es hat geholfen!

dova dominique kabengela
quelle
0

Ich hatte diesen Fehler mit Firebase Admin. Die Lösung bestand darin, den Firebase-Administrator über diesen Link korrekt zu konfigurieren

DigaoParceiro
quelle
0

Für mich war es das Problem mit dem Datum. Es wurde aktualisiert und das Problem wurde behoben.

Lesen / Schreiben zulassen:

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

Bearbeiten: Wenn Sie immer noch verwirrt sind und nicht herausfinden können, wo das Problem liegt, lesen Sie einfach den Abschnitt mit den Regeln in Ihrer Firebase-Konsole.

Wakas Abbasid
quelle
0

Das Zeitlimit ist möglicherweise abgelaufen

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);
    }
  }
}

es gibt Änderungsdatum für heutzutage in dieser Zeile:

 allow read, write: if request.time < timestamp.date(2020,7, 1);
Söhrab Vahidli
quelle
-2

Ihre Regeln sollten für diesen Fall wie folgt aussehen. Die Meldung besagt jedoch, dass dies nicht der vorgeschlagene Weg ist. Wenn Sie dies tun, können Sie Einfügungen ohne Berechtigungsfehler ausführen

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Okan Serdaroğlu
quelle