我目前正在构建一个聊天应用程序,我遇到了Firebase规则的问题。我想限制用户查看他们不参与的对话。但是,当我尝试实施规则时,似乎即使在检查对话是否存在时也会拒绝访问。我如何正确配置Firebase规则以允许用户仅查看他们参与的对话,而不是数据库里的所有对话
这是规则集,我试图只为对话实现。
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));
}
}
}
访问已经在“最高级别”被拒绝,这是这里的这一部分:
// 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));
}
我假设,这与方式有关,这些嵌套的对话正在工作,但我不知道我必须改变什么.我试着在谷歌firebase文档中阅读有关此,但我找不到任何关于这一点.如果你有任何想法,如何解决这个问题,请让我知道.谢谢!
我已经试过让它在多个“规则集”下工作。它总是在exists()-函数处失败。
我也试过这个,但似乎也不行:
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);
}
}
}
}
这是我在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
},
1条答案
按热度按时间omqzjyyz1#
您还没有共享正在运行的触发此故障的查询,但重要的是要记住Firestore rules are not filters。
如果您的查询是这样的:
如果你期望Firestore只返回规则计算结果为
true
的对话,那么这是行不通的。Firestore会看到 * 一些 * 对话文档 * 不 * 计算结果为true
,* 整个查询将失败 *。您需要确保您运行的导致规则评估的查询只查看规则评估为true的对话,例如:
您可以在官方Firestore规则文档中阅读更多内容。