2017-07-04 157 views
0

在Firebase存儲安全規則(而不是實時數據庫)中,有沒有其他方法可以執行檢查:路徑中是否存在其他對象,或存在其他對象的元數據?Firebase存儲安全規則:檢查另一個對象是否存在/檢查對象的元數據


一些背景

目前我儲存安全規則設置,使用戶只具有讀取訪問權限,並沒有寫訪問他們/users/{userId}/路徑。

我有一個管理雲功能,將文件保存到/users/{userId}/necessary-file.pdf。而且我不希望用戶能夠修改或編寫此文件,只有雲功能纔有權執行此操作。要做到這一點,我想我可以匹配類似的文件名:

match /users/{userId}/{fileName} { 
    allow write: if !fileName.matches("necessary-file.pdf") 
} 

問題

有什麼辦法,我只能讓用戶寫一些,其他-file.pdf如果他們在相同的路徑上已經有necessary-file.pdf(或者甚至在其他地方,如果該效果更好)。雖然仍然禁止他們寫necessary-file.pdf

那麼,有什麼辦法讓我做這樣的僞代碼嗎? :

match /users/{userId}/{fileName} { 
    allow read: if request.auth.uid == userId; 
    allow write: if (!fileName.matches("necessary-file.pdf")) && ("necessary-file.pdf".exists()) 
} 

作爲替代方案,我可以有我的雲功能,寫一個元數據必要-file.pdf並檢查太多。有什麼辦法可以執行像這樣的僞代碼嗎? :

allow write: if "necessary-file.pdf".metadata['canUserWrite'] == 'yesUserCan' 

最後

什麼是真正酷的這是,如果這是在任何遠程可能的,它可以用來火力數據庫,並在一個火力點存儲規則之間進行通信不那麼實時的方式。 (referring to this question here)雲端功能可偵聽實時數據庫中預期字段的更改,並將文件寫入Firebase存儲,Firebase存儲可檢查該文件。

回答

3

Firebase的雲存儲安全規則只能訪問有關當前請求和文件的信息。他們無法訪問完整的存儲系統,因此無法檢查是否存在其他文件。

原因是規則在內存中爲每個請求進行評估。爲其他對象提供對雲存儲的訪問會降低性能,使系統不可擴展。同樣的原因解釋了爲什麼您無法從安全規則中訪問Firebase數據庫。

如果您想要這樣的一些控制,您需要查看Firebase的Cloud Functions。如果您的用戶將文件上傳到「暫存」區域,則可以讓雲端功能驗證它們是否滿足所有先決條件,然後纔將文件移動到實際位置(使其可用於進一步處理或供客戶端查看) 。

+0

完美感!那麼我會做更多的思考。非常感謝7月4日的快速回復和祝福! – johnozbay