Keamanan Firestore saat mengambil dokumen berdasarkan id menolak izin

Ketika saya langsung mengambil dokumen menggunakan .doc().get() aturan keamanan firestore menolak izin. Apa yang harus saya lakukan untuk mengizinkan operasi CRUD untuk pengguna aplikasi Ionic saya yang diautentikasi? Saya memiliki fungsi berikut di aplikasi PWA Ionic saya

``` async getUserProfile(): Promise<firebase.firestore.DocumentSnapshot> {
          const user: firebase.User = await this.authProvider.getUser();
          this.currentUser = user;
          console.log('found current user');
          this.userProfile = firebase.firestore().doc(`userProfile/${user.uid}`);
          console.log('returing userprofile', this.userProfile.get());
          return this.userProfile.get();
  }```

Namun panggilan ke this.userprofile.get() gagal karena peringatan keamanan dari aturan Keamanan Firestore

menemukan pengguna saat ini mengembalikan profil pengguna ZoneAwarePromise __zone_symbol__state: 0 __zone_symbol__value: FirebaseError: Izin tidak ada atau tidak mencukupi. di e baru (http://localhost:8100/vendor.js:92760:23) di http:// localhost:8100/vendor.js:102987:28 . . . (http://localhost:8100/polyfills.js:10248:56) kode: izin ditolak nama: FirebaseError toString: ƒ () pesan: Izin tidak ada atau tidak mencukupi. tumpukan: FirebaseError: Izin tidak ada atau tidak mencukupi.\n di baru e

Aturan Keamanan Firestore ditetapkan sebagai berikut

service cloud.firestore {
  match /databases/{database}/documents {
   match /userProfile/{userId}/{documents=**} {
      allow read, update, get,delete: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
} 

Aturan keamanan apa yang harus diterapkan untuk memungkinkan pengguna yang diautentikasi melakukan CRUD dokumen mereka? Atau cara yang benar untuk mengambil dokumen dari koleksi

PEMBARUAN: Ini berfungsi langsung dari simulator tetapi tidak dari aplikasi Screenshot untuk Rules Simulator. Ini berfungsi di sana


person Santosh Tamhane    schedule 28.05.2021    source sumber


Jawaban (2)


Beberapa inspirasi. Saya menggunakan akses berbasis peran yang sangat mendasar ini untuk memungkinkan membaca dan menulis di mana pengguna normal dapat membaca dan admin dapat menulis:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
        
      function googleProvider() {
        return request.auth.token.firebase.sign_in_provider == "google.com"; 
      }
      function getUserData() {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data
      }
      allow read: if googleProvider() && getUserData().roles['user'] == true;      
      allow write: if googleProvider() && getUserData().roles['admin'] == true;
    }
  

} }

person voscausa    schedule 28.05.2021

version aturan keamanan apa yang Anda miliki?

Ada petunjuk untuk versi 1:

Aturan keamanan menggunakan versi 1 secara default. Di versi 1, wildcard rekursif cocok dengan satu atau lebih item jalur. Mereka tidak cocok dengan jalur kosong, jadi cocokkan /cities/{city}/{document=} cocok dengan dokumen di subkoleksi namun tidak di koleksi kota, sedangkan cocok /cities/{document=} cocok dengan keduanya dokumen dalam koleksi dan subkoleksi kota.

Itu bisa menjelaskan mengapa Anda tidak bisa mendapatkan data yang Anda inginkan.

Versi 2 berperilaku berbeda:

Dalam aturan keamanan versi 2, wildcard rekursif cocok dengan nol atau lebih item jalur. match/cities/{city}/{document=**} mencocokkan dokumen di subkoleksi mana pun serta dokumen di koleksi kota.

Di sini Anda dapat melihat keseluruhan dokumennya.

Versinya harus sesuai dengan aturan Anda seperti di sini:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}
person Tarik Huber    schedule 28.05.2021
comment
Saya menggunakan aturan versi 2. Maaf karena tidak menyebutkannya sebelumnya. Anehnya ini bekerja langsung dari simulator. Tapi tidak dari aplikasi. Saya memperbarui kode dengan versi Anda, tetapi kesalahan masih terjadi - person Santosh Tamhane; 28.05.2021