[英]Firestore: Access documents in collection user has permission to
我有一個用於存儲數據的集合,稱為公告。 但是,每個文檔都有一個名為“ permissions”的字段,其中包含一個權限級別字符串。 我編寫了函數來根據用戶的權限級別和資源的權限來確定用戶是否具有訪問權限。
當我為應該正常工作的單個文檔設置onSnapshot回調時,得到響應。 一旦將其切換到獲取集合的快照,它將收到無效的權限錯誤。 根據我的發現,如果用戶無法訪問集合中的任何文檔,firestore就會失敗。 我應該使用哪種模型? 如何獲得用戶也應該訪問的文檔?
規則
match /chapters/{chapter} {
function isMember() {
return exists(/databases/$(database)/documents/chapters/$(chapter)/members/$(request.auth.uid))
}
function getUser() {
return get(/databases/$(database)/documents/chapters/$(chapter)/members/$(request.auth.uid))
}
function hasPermission(userPermission, documentPermission) {
return documentPermission == "all" || userPermission == "admin" || userPermission == documentPermission
}
allow read: if isMember()
match /announcements/{announcement} {
allow read: if isMember() && hasPermission(getUser().data.permissions, resource.data.permissions)
}
}
作品vvv
firestore.collection("chapters").doc("chapter-1").collection("announcements").doc("doc1").onSnapshot(doc => {
const announcements = doc.data()
console.log(announcements)
})
vvv不起作用
firestore.collection("chapters").doc("chapter-1").collection("announcements").onSnapshot(docs => {
docs.forEach(doc => {
const announcements = doc.data()
console.log(announcements)
})
})
這是因為在查詢的情況下, 規則不是filter 。
如文檔中所述,
在編寫查詢以檢索文檔時,請記住,安全規則不是過濾器,查詢是全部或全部。
您需要“編寫查詢以符合安全規則的約束” 。
另一方面,
此行為適用於從集合中檢索一個或多個文檔的查詢, 而不適用於單個文檔的檢索 。 當您使用文檔ID檢索單個文檔時,Cloud Firestore會讀取該文檔並使用您的安全規則和實際文檔屬性評估請求。
這就是為什么當您只查詢一個文檔時它起作用的原因
firestore.collection("chapters").doc("chapter-1").collection("announcements").doc("doc1").onSnapshot()
因此,對於查詢集合,您需要向查詢添加過濾器,如下所示:
firestore.collection("chapters").doc("chapter-1").collection("announcements").where("permissions", "==", "xxxxx");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.