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
486

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 diingatPeraturan Firestore bukan penapis.

Jika pertanyaan anda seperti ini:

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

Jika anda menjangkakan Firestore hanya mengembalikan peraturan yang menilai kepadatrue的对话,那么这是行不通的。 Firestore 将发现某些对话文档不会评估为truedankeseluruhan 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().get()

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

    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!