0

我對Firebase來說很新,而且我遇到了我的安全規則問題。我有一個註冊或登錄新用戶的Android客戶端。在該用戶的第一次登錄,我的數據保存到火力,像這樣:Firebase規則 - 首次登錄時不能存儲用戶數據

public void onAuthenticated(AuthData authData) { 
       //Save user data to firebase 
       Map<String, Object> map = new HashMap<String, Object>(); 
       map.put("provider", authData.getProvider()); 
       ref.child("users").child(authData.getUid()).updateChildren(map); 
} 

(這被稱爲onAuthenticated()驗證用戶時)

然而,看來我的安全規則不允許用戶寫入數據庫,除非他們的數據已經存儲。我的規則如下:

{ 
"rules": { 
    "users":{ 
     "$userid": { 
     ".read": "auth.id == $userid && auth !== null", 
     ".write": "auth.id == $userid && auth !== null" 
     } 
    } 
    } 
} 

而且,如果它很重要,這裏是一個什麼樣的數據看起來實際存儲時,它就像一個例子:我應該如何修改我的規則,以允許客戶端 an example

在用戶數據通過服務器認證後寫入用戶數據?

編輯:經過一些測試,看起來這些規則不允許用戶寫任何東西到他們的用戶節點,即使它已經存在。

回答

5

您的規則,一個錯字您有:

".write": "auth.id == $userid && auth !== null" 

這應該是auth.uid,不auth.id

我也會先做空檢查。

所以:

".write": "auth !== null && auth.uid == $userid" 
+0

爲背景,爲空的檢查是沒有必要在這種情況下。如果訪問auth對象並且它不是對象,則安全規則將失敗。但是,創建它並沒有什麼壞處,並且在編寫這樣的規則時(auth.uid會阻止規則的第二部分執行)會有幫助:'auth.uid ==='frank'|| (auth === null && root.child('foo')。val()==='bar')' – Kato 2014-11-07 17:28:31

+0

Oooh ...我喜歡'auth.uid ==='frank''規則。我們能否將這些注入到每個Firebase中? – 2014-11-07 18:56:46