Heim > Fragen und Antworten > Hauptteil
Ich baue gerade eine Chat-App und habe Probleme mit den Firebase-Regeln. Ich möchte verhindern, dass Benutzer Konversationen sehen, an denen sie nicht teilnehmen. Wenn ich jedoch versuche, diese Regeln zu implementieren, scheint der Zugriff verweigert zu werden, selbst nachdem überprüft wurde, ob die Konversation existiert. Wie konfiguriere ich Firebase-Regeln richtig, damit Benutzer nur die Konversationen anzeigen können, an denen sie teilnehmen, und nicht alle Konversationen in der Datenbank?
Dies ist der Regelsatz, den ich nur für Gespräche zu implementieren versuche.
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)); } } }
Der Zugriff wurde auf der „obersten Ebene“ verweigert, das ist der Teil:
// 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)); }
Ich denke, es hat etwas mit der Art und Weise zu tun, wie diese verschachtelten Gespräche funktionieren, aber ich weiß nicht, was ich ändern muss. Ich habe versucht, dies in der Google Firebase-Dokumentation nachzulesen, konnte aber nichts dazu finden. Wenn Sie Ideen haben, wie Sie das Problem beheben können, lassen Sie es mich bitte wissen. Danke!
Ich habe versucht, es mit mehreren „Regelsätzen“ zum Laufen zu bringen. Bei der Funktion exist() schlägt es immer fehl.
Ich habe es auch versucht, aber es scheint auch nicht zu funktionieren:
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); } } } }
Dies ist die Abfrage, die ich in Vue.js verwende:
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粉4595788052023-09-09 14:03:04
您尚未共享正在运行的触发此故障的查询,但请务必记住Firestore 规则不是过滤器。
如果您的查询是这样的:
firestore.collection("conversation").get()
如果您期望 Firestore 仅返回规则计算结果为 true
的对话,那么这是行不通的。 Firestore 将发现某些对话文档不会评估为true
并且整个查询将失败。
您需要确保您运行的导致规则评估的查询仅查看规则评估为 true 的对话,例如:
firestore.collection("conversation").where(<some condition>).get()
您可以在官方 Firestore 规则文档.