firestore: PERMISSION_DENIED: Eksik veya yetersiz izinler


126

Hata alıyorum

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Eksik veya yetersiz izinler.

else ifadesinde aşağıdaki kod için

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

Kullanıcı oturum açtı mı?
Suhayl SH

4
Firebase Console'da Güvenlik Sekmesi altındaki kuralları belirlediniz mi?
Suhayl SH

1
Hatam, bulut yangın deposunun bırakma kutusunu görmedim. Yalnızca gerçek zamanlı veritabanını kontrol ediyordum.
S Rekhu

teşekkürler @SuhaylSH
S Rekhu

Yanıtlar:


182

Benim için çalışıyor.

Veritabanına gidin -> Kurallar ->

Yanlışı değiştirin allow read, write: if ; için doğrudur;

Not: Bu, veritabanı için güvenliği tamamen kapatır!

Kimlik doğrulaması olmadan dünyaya yazılabilir hale getirmek !!! Bu, bir üretim ortamı için tavsiye edilecek bir çözüm DEĞİLDİR. Bunu yalnızca test amacıyla kullanın.


44
herkesin herhangi bir yetkilendirme olmadan veritabanınızı okumasına, yazmasına izin verdiğini unutmayın.
Sai Gopi Me

110
Bu korkunç bir çözüm, bu kelimenin tam anlamıyla güvenliği devre dışı bırakır. Bunun yerine şunu okuyun: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu çünkü bu herkes için çalışıyor
Luvnish Monga

11
@DuncanLuk'un dediği gibi, bu korkunç bir çözüm. Buna bir çözüm bile
demezdim

6
Gerçekten hızlı başlamak için en iyi çözüm. Güvenlik endişeleri daha sonra çözülebilir.
Viacheslav Dobromyslov

79

Veritabanına Git -> Kurallar :

Sonra aşağıdaki kurallar değişti

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

aşağıya

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

9
Bu kötü bir fikirdir, bu, TÜM belgeleri HERHANGİ bir kullanıcı tarafından yazılabilir yapar, hatta diğer kullanıcılara ait olanlar, sadece yönetici tarafından yazılabilen veya hiç yazılamayan şeyler bile. Lütfen ilk kod parçasını, uygulanmamış güvenlik kurallarına karşı bir koruma olduğu için saklayın.
Noxxys

1
Kişilerin kaydolmasına izin verirseniz (örneğin, Google SSO ile) otomatik olarak tüm verilerinize erişebileceklerini unutmayın.
ForrestLyman

2
Kimliği doğrulanmış kullanıcılarımın (az sayıda) tüm belgelere erişmesine izin vermek istiyorum, bu nedenle bu tarif benim durumum için mükemmel.
AFD

20

Yani benim durumumda aşağıdaki DB kurallarına sahiptim:

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

Gördüğünüz gibi bir uid , storybelgede sahibini işaretlemek için alan var .

Sonra kodumda tüm hikayeleri sorguluyordum (Flutter):

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

Ve başarısız oldu çünkü zaten farklı kullanıcılar aracılığıyla bazı hikayeler ekledim. Düzeltmek için sorguya koşul eklemeniz gerekir:

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

Daha fazla ayrıntı burada: https://firebase.google.com/docs/firestore/security/rules-query

DÜZENLE: bağlantıdan

Kurallar filtre değildir Belgeleri almak için sorgular yazarken, güvenlik kurallarının filtre olmadığını unutmayın - sorgular hepsi ya da hiçtir. Size zaman ve kaynak kazandırmak için Cloud Firestore, tüm belgeleriniz için gerçek alan değerleri yerine olası sonuç kümesine göre bir sorguyu değerlendirir. Bir sorgu potansiyel olarak istemcinin okuma iznine sahip olmadığı belgeleri döndürebilirse, isteğin tamamı başarısız olur.


kullanıcı nesnesi nedir?
Phani Rithvij

Bu en iyi cevap
Elia Weiss

13

Yukarıda oylanan cevaplar veri tabanınızın sağlığı için tehlikelidir. Veritabanınızı yine de yazmak için değil yalnızca okumak için kullanılabilir hale getirebilirsiniz:

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

1
İzinleri etkinleştirmenin doğru yolu nedir, ancak herkes için değil?
nyxee

8

Java Swing Uygulamasında denerseniz.

  1. Git Firebase Console> Project Overview>Project Settings

  2. Ardından Hizmet Hesapları Sekmesine gidin ve Yeni Özel Anahtar Oluştur'a tıklayın.

  3. Bir .json dosyası alacaksınız, onu bilinen bir yola yerleştireceksiniz

  4. Ardından Bilgisayarım Özellikleri, Gelişmiş Sistem Ayarları, Ortam Değişkenleri'ne gidin.

  5. GOOGLE_APPLICATION_CREDENTIALSJson dosyasına giden yolunuzla Yeni Yol Değişken Değeri oluşturun .


Bu benim de sorunumdu, bununla ilgili belgeler belgelerde var .
tris timb

5

npm i - firebase'i kaydet @ açısal / ateş

app.module'da içe aktardığınızdan emin olun

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

ithalatta

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

gerçek zamanlı veritabanı kurallarında sahip olduğunuzdan emin olun

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

bulutta yangın deposu kurallarına sahip olduğunuzdan emin olun

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

3

DB'nizin boş olmadığından veya sorgunuzun var olmayan kişileri toplamak için olmadığından emin olun


9
Bu istisnanın boş toplama veya veri toplama ile ilgisi yok, bu bir izin sorunu
Ojonugwa Jude Ochalifu

Bu istisnanın boş Db vb. İle ilgisi yoktur. Güvenlik kuralları ve Yetkilendirme ile ilgili sorun.
Rehan Ali

Ben ve en az 3 kişi bu senaryoda bu istisnaya sahibiz. Size yardımı
olmazsa

3

Ek olarak, kodunuzdaki koleksiyon referansı firebase'deki koleksiyon adıyla eşleşmezse bu hatayı alabilirsiniz.

Örneğin firebase'deki koleksiyon adı users, ancak ona db.collection("Users")veya ile referans veriyorsunuzdb.collection("user")

Aynı zamanda büyük / küçük harfe duyarlıdır.

Umarım bu birine yardımcı olur


Koleksiyon örtük olarak oluşturulmamış mı? Örneğinizde, "Kullanıcılar" ve "kullanıcı" koleksiyonu, başvurulduğunda ve başvurulduğunda oluşturulur.
bdev TJ


@DevTJ bir talep addveya settalep olduğunda haklısınız , ancak sorudan bir gettalep. Bunu daha önce yaşadım
Anga


2

Birisi buraya bir servis hesabıyla Firestore'a erişmeye çalışırken gelirse:

GCP'nin IAM ayarlarındaki role Service Account Userek olarak hizmet hesabına da rol vererek bu sorunu Cloud Datastore Userçözdüm.


2

Şu anda, Haziran 2020, varsayılan olarak firebase zamana göre tanımlanmıştır. İhtiyaçlarınızı karşılayacak zamanı tanımlayın.

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

Lütfen dikkat: DB'niz hala herkese açık. Size tavsiye ederim, lütfen belgeleri okuyun ve DB'yi sizin için yararlı olacak şekilde yapılandırın.


1

sorun, kullanıcının kimliği doğrulanmadan önce verileri gerçek zamanlı veritabanına veya firestore'a okumaya veya yazmaya çalışmış olmanızdır. lütfen kodunuzun kapsamını kontrol etmeyi deneyin. umarım yardımcı olmuştur!



1

Benim için tarih sorunu buydu. Güncelleme yapıldı ve sorun çözüldü.

Okumaya / yazmaya izin ver:

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

Düzenleme: Hala kafanız karıştıysa ve sorunun ne olduğunu anlayamıyorsanız, firebase konsolunuzdaki kurallar bölümüne bir göz atın.


1

zaman sınırı aşılmış olabilir

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

bu satırda bugünler için değişiklik tarihi var :

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

0

Firebase'deki kurallara GİT ve kuralları düzenle ..... (bir zaman damgası sağlayın veya yanlış olarak ayarlayın) Çözümüm.

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


-1

Bu durum için kurallarınız böyle olmalı ancak mesaj bunun önerilen yol olmadığını söylüyor, ancak bunu yaparsanız eklemeleri izin hatası olmadan yapabilirsiniz.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.