firestore: PERMISSION_DENIED: Izin tidak ada atau tidak memadai


119

Saya mendapatkan Error

Gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Izin tidak ada atau tidak memadai.

untuk kode di bawah ini pada pernyataan lain

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

Apakah pengguna sudah masuk?
Suhayl SH

4
Sudahkah Anda menetapkan aturan pada Tab Keamanan di Konsol Firebase?
Suhayl SH

1
Kesalahan saya, saya tidak melihat kotak drop untuk cloud firestore. Saya hanya mengecek di database realtime.
S Rekhu

terima kasih @SuhaylSH
S Rekhu

Jawaban:


176

Ini bekerja untuk saya.

Masuk ke Database -> Rules ->

Ubah allow read, write: if salah; untuk benar;

Catatan: Ini sepenuhnya mematikan keamanan untuk database!

Membuatnya dapat ditulis di dunia tanpa otentikasi !!! Ini BUKAN solusi yang direkomendasikan untuk lingkungan produksi. Gunakan ini hanya untuk tujuan pengujian.


44
perhatikan bahwa ini memungkinkan semua orang untuk membaca, menulis database Anda tanpa otorisasi apa pun.
Sai Gopi Me

105
Ini adalah solusi yang mengerikan, ini benar-benar hanya menonaktifkan keamanan. Bacalah ini sebagai gantinya: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu karena ini bekerja untuk semua orang
Luvnish Monga

11
Seperti yang dikatakan @DuncanLuk, ini adalah solusi yang buruk. Saya bahkan tidak akan menyebutnya sebagai solusi
Ojonugwa Jude Ochalifu

6
Solusi terbaik untuk memulai dengan sangat cepat. Masalah keamanan sebenarnya bisa diperbaiki nanti.
Viacheslav Dobromyslov

79

Pergi ke Database -> Rules :

Kemudian diubah di bawah aturan

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

ke bawah

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

9
Ini adalah ide yang buruk, ini membuat SEMUA dokumen dapat ditulis oleh SETIAP pengguna yang diautentikasi, bahkan hal-hal yang dimiliki pengguna lain, hal-hal yang seharusnya hanya dapat ditulis oleh admin atau tidak pernah dapat ditulis sama sekali. Harap pertahankan bagian pertama kode karena ini adalah pelindung dari aturan keamanan yang tidak diterapkan.
Noxxys

1
Perhatikan bahwa jika Anda mengizinkan orang mendaftar (dengan Google SSO misalnya) mereka secara otomatis akan memiliki akses ke semua data Anda.
ForrestLyman

2
Saya ingin mengizinkan pengguna terotentikasi saya (sejumlah kecil) untuk mengakses semua dokumen, jadi resep ini sangat cocok untuk kasus saya.
AFD

1
Ini harus menjadi jawaban yang diterima.
Ishaan

19

Jadi dalam kasus saya, saya memiliki aturan DB berikut:

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

Seperti yang Anda lihat, ada uidbidang di storydokumen untuk menandai pemiliknya.

Kemudian di kode saya, saya menanyakan semua cerita (Flutter):

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

Dan itu gagal karena saya telah menambahkan beberapa cerita melalui pengguna yang berbeda. Untuk memperbaikinya Anda perlu menambahkan kondisi ke kueri:

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

Detail selengkapnya ada di sini: https://firebase.google.com/docs/firestore/security/rules-query

EDIT: dari link

Aturan bukan filter Saat menulis kueri untuk mengambil dokumen, perlu diingat bahwa aturan keamanan bukanlah filter — kueri adalah semua atau tidak sama sekali. Untuk menghemat waktu dan sumber daya Anda, Cloud Firestore mengevaluasi kueri terhadap kumpulan hasil potensial, bukan nilai kolom sebenarnya untuk semua dokumen Anda. Jika kueri berpotensi mengembalikan dokumen yang klien tidak memiliki izin untuk membacanya, seluruh permintaan gagal.


apa objek pengguna?
Phani Rithvij

Ini adalah jawaban terbaik
Elia Weiss

12

Jawaban yang dipilih di atas berbahaya bagi kesehatan database Anda. Anda masih dapat membuat database Anda tersedia hanya untuk membaca dan bukan untuk menulis:

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

1
apa cara yang benar untuk mengaktifkan izin, tetapi tidak untuk semua orang?
nyxee

8

Jika Anda coba di Aplikasi Java Swing.

  1. Go To Firebase Console> Project Overview>Project Settings

  2. Kemudian Pergi ke Tab Akun Layanan dan Kemudian Klik Hasilkan Kunci Pribadi Baru.

  3. Anda akan mendapatkan file .json, letakkan di jalur yang diketahui

  4. Kemudian Pergi ke Properti Komputer Saya, Pengaturan Sistem Lanjutan, Variabel Lingkungan.

  5. Buat GOOGLE_APPLICATION_CREDENTIALSNilai Variabel Jalur Baru dengan jalur Anda ke file json.


Ini adalah masalah saya juga, ada informasi untuk ini di dokumen .
tris timb

5

npm i --simpan firebase @ angular / fire

di app.module pastikan Anda mengimpor

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

dalam impor

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

dalam aturan database realtime pastikan Anda memilikinya

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

dalam aturan firestore cloud, pastikan Anda memilikinya

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

3

pastikan DB Anda tidak kosong atau kueri Anda untuk koleksi yang tidak ada


9
Pengecualian ini tidak ada hubungannya dengan collection atau db kosong, ini masalah izin
Ojonugwa Jude Ochalifu

Pengecualian ini tidak ada hubungannya dengan Db kosong dll. Masalah dengan aturan keamanan dan Auth.
Rehan Ali

Saya & setidaknya 3 orang lainnya memiliki pengecualian ini pada skenario ini. Jika tidak membantu Anda, lanjutkan ke solusi berikutnya
itzhar

3

Selain itu, Anda mungkin mendapatkan kesalahan ini jika referensi koleksi dari kode Anda tidak cocok dengan nama koleksi di firebase.

Misalnya nama koleksi di firebase adalah users, tetapi Anda mereferensikannya dengan db.collection("Users")ataudb.collection("user")

Ini juga peka huruf besar / kecil.

Semoga ini bisa membantu seseorang


Bukankah koleksi dibuat secara implisit? Dalam contoh Anda, koleksi "Pengguna" dan "pengguna" akan dibuat sebagai dan ketika dirujuk.
bdev TJ


@DevTJ Anda benar ketika itu addatau setpermintaan, tetapi dari pertanyaan itu adalah getpermintaan. Saya pernah mengalami ini sebelumnya
Angga


2

Jika seseorang mendarat di sini mencoba mengakses Firestore dengan akun layanan:

Saya memecahkan masalah ini dengan memberikan Service Account Userperan pada akun layanan selain Cloud Datastore Userperan dalam setelan IAM GCP.


2

Saat ini, Juni 2020, secara default firebase ditentukan oleh waktu. Tentukan waktu untuk memenuhi kebutuhan Anda.

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

Harap diperhatikan: DB Anda masih terbuka untuk siapa saja. Saya sarankan, silakan baca dokumentasi dan konfigurasikan DB dengan cara yang berguna bagi Anda.


1

masalahnya adalah Anda mencoba membaca atau menulis data ke database realtime atau firestore sebelum pengguna diautentikasi. coba periksa cakupan kode Anda. semoga membantu!



1

Bagi saya itu masalah dengan tanggal. Memperbarui dan masalah telah teratasi.

Izinkan baca / tulis:

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

Edit: Jika Anda masih bingung dan tidak dapat mencari tahu apa masalahnya, lihat saja bagian aturan di konsol firebase Anda.


1

batas waktu mungkin berakhir

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

ada perubahan tanggal untuk saat ini di baris ini:

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


-1

Aturan Anda harus seperti ini untuk kasus ini namun pesan mengatakan bahwa itu bukan cara yang disarankan, tetapi jika Anda melakukan ini, Anda dapat melakukan penyisipan tanpa kesalahan izin

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.