0

我想在另一個文檔的基礎上驗證在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。

感謝您的幫助。

更新 - 臨時解決方案 由於存在Firestore安全規則錯誤,數據屬性未填充。這將被修復。對於GET()工作的臨時解決方案如下:

get(path).data.prop || get(path).prop

+0

我很好奇,爲什麼你不直接使用'exists'? –

+0

代碼被簡化了。真正的用例是在'get(/ databases/$(database)/ documents/test/$(testId))'上查找一個值,並將其用於驗證。 – DauleDK

+0

啊,好的。使用id作爲例子很可能會引起誤解,因爲您應該始終使用exists來檢查文檔是否存在。你可以同時存在並獲得規則中的同一個文檔,而不需要進行額外的查找(我們的系統將這些請求重複數據刪除) –

回答

3

resource.id還不存在,這就是爲什麼你不能做到這一點。

+0

我不知道我在這裏跟着你嗎?這個文件:'/ databases/$(database)/documents/test/SRJKCxU4HVDBdB3qyfzG'當然存在嗎? – DauleDK

+0

作爲系統的一個功能。 Get()返回一個'resource',我們不支持這個id。 –

+0

好吧。但是我試圖在資源上檢索一個名爲id的數據屬性。並且此代碼返回get(/ databases/$(database)/ documents/test/$(testId))。data.id ==「SRJKCxU4HVDBdB3qyfzG」'不能按預期工作。 – DauleDK

2

this Stack Overflow question,目前在火力地堡安全規則的錯誤:

因爲錯誤是不填充該數據對象,你應該檢查這兩個屬性。有沒有埃塔上啓動這個bug的解決方案..

臨時的解決方法是更改​​代碼這樣:

return get(/databases/$(database)/documents/test/$(testId)).id == "SRJKCxU4HVDBdB3qyfzG" || get(/databases/$(database)/documents/test/$(testId)).data.id == "SRJKCxU4HVDBdB3qyfzG"

+0

.id和data.id是不同的字段,所以這是不正確的。 data.id是文檔中名爲id的用戶定義字段,而不是文檔的id。 –

+0

讓我來檢查一下。 – DauleDK

+0

您可以在控制檯中測試它。創建一個新文檔,然後使用不同的值添加一個名爲id的字段。 –

相關問題