การรักษาความปลอดภัย Firestore เมื่อดึงเอกสารด้วย id ปฏิเสธการอนุญาต

เมื่อฉันดึงเอกสารโดยตรงโดยใช้ .doc().get() การรักษาความปลอดภัย firestore จะปฏิเสธการอนุญาต ฉันต้องทำอย่างไรเพื่ออนุญาตการดำเนินการ CRUD สำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้องของแอป Ionic ของฉัน ฉันมีฟังก์ชันต่อไปนี้ในแอป PWA Ionic

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

แต่การเรียกไปยัง this.userprofile.get() ล้มเหลวเนื่องจากคำเตือนด้านความปลอดภัยจากกฎความปลอดภัยของ Firestore

พบผู้ใช้ปัจจุบันที่คืนโปรไฟล์ผู้ใช้ ZoneAwarePromise __zone_สัญลักษณ์__สถานะ: 0 __zone_สัญลักษณ์__ค่า: FirebaseError: การอนุญาตที่ขาดหายไปหรือไม่เพียงพอ ที่ e ใหม่ (http://localhost:8100/vendor.js:92760:23) ที่ http:// localhost:8100/vendor.js:102987:28 . . . (http://localhost:8100/polyfills.js:10248:56) รหัส: ชื่อที่ถูกปฏิเสธสิทธิ์: FirebaseError toString: ƒ () ข้อความ: สิทธิ์ขาดหายไปหรือไม่เพียงพอ stack: FirebaseError: สิทธิ์ขาดหายไปหรือไม่เพียงพอ\n ที่ e ใหม่

กฎความปลอดภัยของ Firestore ได้รับการตั้งค่าง่ายๆ ดังนี้

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

กฎความปลอดภัยที่ถูกต้องควรนำไปใช้อย่างไรเพื่ออนุญาตให้ผู้ใช้ที่ได้รับการรับรองความถูกต้องสามารถ CRUD เอกสารของตนได้ หรือวิธีที่ถูกต้องในการดึงเอกสารจากการรวบรวม

อัปเดต: มันทำงานได้โดยตรงจากเครื่องจำลอง แต่ไม่ใช่จากแอป ภาพหน้าจอสำหรับ Rules Simulator ซึ่งใช้งานได้ที่นั่น


person Santosh Tamhane    schedule 28.05.2021    source แหล่งที่มา


คำตอบ (2)


แรงบันดาลใจบางอย่าง ฉันใช้การเข้าถึงตามบทบาทพื้นฐานนี้เพื่ออนุญาตให้อ่านและเขียนโดยที่ผู้ใช้ทั่วไปสามารถอ่านได้และผู้ดูแลระบบสามารถเขียนได้:

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 อะไรบ้าง

มีคำใบ้สำหรับเวอร์ชัน 1:

กฎความปลอดภัยจะใช้เวอร์ชัน 1 เป็นค่าเริ่มต้น ในเวอร์ชัน 1 ไวด์การ์ดแบบเรียกซ้ำจะจับคู่รายการพาธตั้งแต่หนึ่งรายการขึ้นไป ไม่ตรงกับพาธว่าง ดังนั้น match /cities/{city}/{document=} จะจับคู่เอกสารในคอลเลกชันย่อย แต่ไม่ตรงกับคอลเลกชันเมือง ในขณะที่ match /cities/{document=} จะจับคู่ทั้งสองอย่าง เอกสารในการรวบรวมเมืองและคอลเลกชันย่อย

นั่นอาจอธิบายได้ว่าทำไมคุณไม่สามารถรับข้อมูลที่คุณต้องการได้

เวอร์ชัน 2 มีพฤติกรรมแตกต่างออกไป:

ในกฎความปลอดภัยเวอร์ชัน 2 ไวด์การ์ดแบบเรียกซ้ำจะจับคู่รายการพาธเป็นศูนย์หรือมากกว่า match/cities/{city}/{document=**} จับคู่เอกสารในคอลเลกชันย่อยใดๆ รวมถึงเอกสารในคอลเลกชันเมือง

ที่นี่ คุณสามารถดูเอกสารทั้งหมดได้

เวอร์ชันควรอยู่เหนือกฎของคุณดังนี้:

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
ฉันใช้กฎเวอร์ชัน 2 ขออภัยที่ไม่ได้กล่าวถึงก่อนหน้านี้ น่าแปลกที่มันทำงานได้จากเครื่องจำลองโดยตรง แต่ไม่ใช่จากแอพ ฉันอัปเดตโค้ดด้วยเวอร์ชันของคุณแล้ว แต่ข้อผิดพลาดยังคงเกิดขึ้น - person Santosh Tamhane; 28.05.2021