Peraturan Firestore menolak setiap permintaan untuk bersembang aplikasi dengan koleksi bersarang. Apa yang saya buat salah?
P粉627136450
P粉627136450 2023-09-08 15:04:01
0
1
528

Saya sedang membina apl sembang dan saya menghadapi masalah dengan peraturan Firebase. Saya mahu mengehadkan pengguna daripada melihat perbualan yang mereka bukan sebahagian daripadanya. Walau bagaimanapun, apabila saya cuba melaksanakan peraturan ini, akses nampaknya dinafikan walaupun selepas menyemak untuk melihat sama ada perbualan itu wujud. Bagaimanakah cara saya mengkonfigurasi peraturan Firebase dengan betul untuk membenarkan pengguna melihat hanya perbualan yang mereka sertai, bukannya semua perbualan dalam pangkalan data?

Ini adalah set peraturan yang saya cuba laksanakan hanya untuk perbualan.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    
    // Allow users to read and write their own participant documents
    match /conversation/{conversationId}/participants/{userId} {
      allow read, write: if request.auth.uid == userId;
    }

    // Allow users to read and write messages in a conversation they are a participant of
    match /conversation/{conversationId}/messages/{messageId} {
      allow read, write: if exists(/databases/$(database)/documents/conversation/$(conversationId)/participants/$(request.auth.uid));
    }

    // Allow users to read and write their own conversation documents
    match /conversation/{conversationId} {
      allow read, write: if exists(/databases/$(database)/documents/conversation/$(conversationId)/participants/$(request.auth.uid));
    }
  }
}

Akses telah dinafikan pada "peringkat atas", itulah bahagian:

// Allow users to read and write their own conversation documents
    match /conversation/{conversationId} {
      allow read, write: if exists(/databases/$(database)/documents/conversation/$(conversationId)/participants/$(request.auth.uid));
    }

Saya rasa, ia ada kaitan dengan cara perbualan bersarang ini berfungsi, tetapi saya tidak tahu apa yang perlu saya ubah. Saya cuba membaca tentang ini dalam dokumentasi google firebase tetapi tidak dapat mencari apa-apa yang berkaitan dengan ini. Jika anda mempunyai sebarang idea bagaimana untuk membetulkannya, sila beritahu saya. Terima kasih!

Saya telah cuba menjadikannya berfungsi dengan berbilang "set peraturan". Ia sentiasa gagal pada fungsi exists().

Saya pun dah cuba ni tapi nampak tak berkesan juga:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    function isUserInParticipants(conversationId) {
      return get(/databases/$(database)/documents/conversations/$(conversationId)/participants/$(request.auth.uid)).data != null;
    }

    match /conversations/{conversationId} {
      allow read, write: if request.auth != null && isUserInParticipants(conversationId);

      match /messages/{messageId} {
        allow read, write: if request.auth != null && isUserInParticipants(conversationId);
      }
    }
  }
}

Ini adalah pertanyaan yang saya gunakan dalam Vue.js:

init() {
      const storeAuth = useStoreAuth();
      conversationCollectionRef = collection(db, 'conversation')
      conversationCollectionQuery = query(conversationCollectionRef) 
      this.getConversations()
    },
    async getConversations() {
      this.coversationsLoaded = false
      getConversationSnapshot = onSnapshot(conversationCollectionQuery, (snapshot) => {
        console.log('getConversations')
        console.log(snapshot)
        this.conversations = []
        snapshot.forEach((doc) => {
          this.getMessagesOfConversation(doc.id)
          const conversation = {
            id: doc.id,
            ...doc.data(),
          }
          this.conversations.push(conversation)
        })
      })
      this.coversationsLoaded = true
    },

P粉627136450
P粉627136450

membalas semua(1)
P粉459578805

Anda belum berkongsi pertanyaan yang anda jalankan yang mencetuskan kegagalan ini, tetapi penting untuk diingat Peraturan Firestore bukan penapis .

Jika pertanyaan anda seperti ini:

firestore.collection("conversation").get()

Jika anda menjangkakan Firestore hanya mengembalikan peraturan yang menilai kepada true 的对话,那么这是行不通的。 Firestore 将发现某些对话文档不会评估为truedan keseluruhan pertanyaan akan gagal.

Anda perlu memastikan bahawa pertanyaan yang anda jalankan yang menyebabkan peraturan menilai hanya melihat pada perbualan yang peraturan menilai kepada benar, contohnya:

firestore.collection("conversation").where(<some condition>).get()

Anda boleh menemuinya dalam dokumen peraturan Firestore中了解更多信息> rasmi.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan