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 },
Anda belum berkongsi pertanyaan yang anda jalankan yang mencetuskan kegagalan ini, tetapi penting untuk diingat Peraturan Firestore bukan penapis .
Jika pertanyaan anda seperti ini:
Jika anda menjangkakan Firestore hanya mengembalikan peraturan yang menilai kepada
true
的对话,那么这是行不通的。 Firestore 将发现某些对话文档不会评估为true
dan 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:
Anda boleh menemuinya dalam dokumen peraturan Firestore中了解更多信息> rasmi.