我想在另一個文檔的基礎上驗證在firestore中的讀取。基本的firestore安全規則:exists()工作 - 爲什麼get()不是?
數據結構由2個集合組成:「執行」和「測試」。
在測試集只有1號文件,具有以下ID:SRJKCxU4HVDBdB3qyfzG和theese值:
admin true id: "SRJKCxU4HVDBdB3qyfzG" test: 1
我的安全規則是這樣的:
service cloud.firestore {
match /databases/{database}/documents {
function testFunction(testId) {
// return exists(/databases/$(database)/documents/test/$(testId));
return get(/databases/$(database)/documents/test/$(testId)).data.id == "SRJKCxU4HVDBdB3qyfzG";
}
match /execution/{exeid} {
allow read, write: if testFunction("SRJKCxU4HVDBdB3qyfzG");
}
}
}
如果我使用return exists(/databases/$(database)/documents/test/$(testId));
一切工作如預期。但是無論如何我不能讓這條線路工作return get(/databases/$(database)/documents/test/$(testId)).data.id == "SRJKCxU4HVDBdB3qyfzG"
。
我真的很希望我缺少簡單明顯的東西嗎?任何幫助都很常見。如果需要,我還創建了一個演示Firebase項目和stackblitz。
- Stackblitz https://stackblitz.com/edit/angular-atfasp
- 火力地堡 - 發送一個下午。
感謝您的幫助。
更新 - 臨時解決方案 由於存在Firestore安全規則錯誤,數據屬性未填充。這將被修復。對於GET()工作的臨時解決方案如下:
get(path).data.prop || get(path).prop
我很好奇,爲什麼你不直接使用'exists'? –
代碼被簡化了。真正的用例是在'get(/ databases/$(database)/ documents/test/$(testId))'上查找一個值,並將其用於驗證。 – DauleDK
啊,好的。使用id作爲例子很可能會引起誤解,因爲您應該始終使用exists來檢查文檔是否存在。你可以同時存在並獲得規則中的同一個文檔,而不需要進行額外的查找(我們的系統將這些請求重複數據刪除) –