2013-10-22 116 views
23

這是我第一次進入Firebase & nosql,我來自SQL背景。如何在firebase中實現基於角色的訪問控制

使用簡單登錄安全電子郵件/密碼,如何限制對Firebase中數據的訪問?例如,某些用戶將有權創建業務對象(用戶,客戶,類別等),而其他用戶則不能。有沒有辦法將權限列表附加到「auth」變量?

回答

24

沒有辦法將權限直接附加到auth變量(或者至少看起來並不是預期的策略)。我建議建立由auth.uid組織用戶的集合,你可以讓你在想有什麼樣的權限屬性,這樣你的安全規則可能的東西看起來像這樣(未經):

{ 
    "rules": { 
    ".read": true, 
    "users": { 
     ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'" 
    } 
    } 
} 

哪裏role是屬於您的users集合中所有對象的屬性。

+0

謝謝您的迴應。我清楚地知道,您建議我爲每個用戶記錄添加一個布爾值,以指示他們是否有權訪問他們正在訪問的資源。那是對的嗎?我是否需要爲每種類型的業務對象(用戶,客戶,類別等)創建類似的規則? – acole76

+3

如果不知道自己的應用需求,很難知道您需要什麼,我只是試圖傳達您如何在Firebase中管理這種「許可」的一般策略。根據您構建實際數據的方式,您可能需要或可能不需要多次使用該規則。你可能需要也可能不需要每個用戶的布爾值,也許他們只有一個用戶類型字符串,比如「admin」',並且你匹配。也許只有「管理員」需要該屬性,因爲沒有它,權限將默認失敗。明白了嗎? – hiattp

+0

我更新了示例以使其更加清晰。 – hiattp

1

火力地堡推出通過ID令牌上的自定義用戶權利上的任何用戶基於角色的訪問支持:https://firebase.google.com/docs/auth/admin/custom-claims

您需要定義管理員訪問規則:

{ 
    "rules": { 
    "adminContent": { 
     ".read": "auth.token.admin === true", 
     ".write": "auth.token.admin === true", 
    } 
    } 
} 

設置使用Firebase Admin SDK的用戶角色:

// Set admin privilege on the user corresponding to uid. 
admin.auth().setCustomUserClaims(uid, {admin: true}).then(() => { 
    // The new custom claims will propagate to the user's ID token the 
    // next time a new one is issued. 
}); 

這將傳播到相應的用戶的ID令牌聲明。 您可以強制刷新令牌後立即:user.getIdToken(true)

要從客戶端上的令牌解析它,你需要爲base64解碼ID令牌的有效載荷:https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client

您可以根據需要升級/降級的用戶。他們還提供了編程方式來列出所有用戶,如果您有重複腳本來更改用戶的訪問級別:https://firebase.google.com/docs/auth/admin/manage-users#list_all_users

相關問題