2016-07-04 42 views
3

有沒有辦法根據組控制上傳到Firebase存儲中的路徑? 例如有一個管理員組可以上傳到任何地方或只能上傳到某個特定路徑的團隊。在不使用自定義授權的情況下創建對Firebase存儲的組訪問

+0

相關討論:[保護用戶數據指南](https://firebase.google.com/docs/storage/security/user-security)(提及組方法),[用戶組,驗證聲明和自定義令牌] (https://groups.google.com/forum/#!searchin/firebase-talk/groups$20auth$20claims%7Csort:relevance/firebase-talk/77i9CRlwg88/iQsE78CbGQAJ)小組討論。 – Kato

回答

7

在搜索了一下後,我沒有找到現成的答案,所以我會發布我到目前爲止的內容。很高興知道是否有其他(更好)的方法來做到這一點。

由於我試圖不使用另一臺服務器,自定義身份驗證令牌不在。但是,存儲規則可以使用request.auth.uid。 uid屬性與Auth區域中定義的其中一個用戶相匹配。您需要在存儲規則中創建一個函數,檢查request.auth.uid是否在您定義的組中。

Firebase存儲規則具有唯一的語法。它看起來像JavaScript,但它不是。您可以定義函數,但不能在其中聲明一個var。此外,還有一些可用的類似於JavaScript的方法。

例如,我第一次沒有成功試過如下:

function isAdmin() { 
    return ["value","list"].indexOf(request.auth.uid) > -1; 
} 

service firebase.storage {...} 

無論是規則編輯器扔的錯誤,當我試圖定義一個變種或當我使用.indexOf它總是返回「未經授權」。

以下結束爲我工作。

function isAdmin() { 
    return request.auth.uid in { 
    "yaddayadddayaddUserIDKey":"User Name1" 
    }; 
} 
function isSomeOtherGroup() { 
    return request.auth.uid in { 
    "yaddayaddaSomeOtherUID":"User Name2", 
    "YaddBlahBlahUID":"User Name3" 
    }; 
} 

service firebase.storage { 
    match /b/<your bucket here>/o { 
    match /{allPaths=**} { 
     allow read, write: if isAdmin(); 
    } 
    match /path/{allPaths=**} { 
     allow read, write: if isSomeOtherGroup() || isAdmin(); 
    } 
    } 
} 
+0

我只是試過這個解決方案,但由於某種原因,它不工作。你在路上發現了什麼其他警告? –

+0

我只使用電子郵件地址驗證。我沒有嘗試使用谷歌或臉書認證。 – ecalvo

4

我沒有足夠的聲望評論@ ecalvo的答案。所以我添加了一個答案。該功能isAdmin()可以提供一個名單如下:

function isAdmin() { 
    return request.auth !=null && request.auth.uid in [ 
     "uidAdmin1", 
     "uidAdmin2", 
     "uidOfOtherAdminsAsCommaSeparatedStrings" 
    ]; 
} 

休息的實施可以從@ecalvo的答案借用。我感覺現在更清楚了。在@ecalvo的回答中,我很困惑,爲什麼當我只需要比較uid時,我應該給用戶名呢?

相關問題