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

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.


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

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.


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

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.


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

3

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


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


Wird die Sammlung nicht implizit erstellt? In Ihrem Beispiel werden die Sammlungen "Benutzer" und "Benutzer" erstellt, sobald darauf verwiesen wird.
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.


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

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!


0

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


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.


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


-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;
    }
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.