2015-04-27 40 views
3

我試圖阻止將不需要的字段添加到我的用戶對象中。 - >用戶可以有電話和用戶名(但不必 - > newData.hasChildren(['phone','username'])在這裏不起作用)。 我第一次嘗試這樣的:Firebase安全規則:驗證對象中允許使用哪些字段

"users": { 
    "$uid": { 
     "$other": { 
      ".validate": "['phone', 'username'].indexOf($other) > -1" 
     } 
    } 
} 

我得到的,因爲數組:(

所以的錯誤,那麼我想過做這樣的事情,但它確實不是很大,如果我有許多潛在的領域

"$other": { 
    ".validate": "$other === 'phone' || $other === 'username'" 
} 

最後,我創建了我的火力地堡稱爲「規則」的一個節點,這樣做:

"rules": { 
    "users": { 
     "fields": { 
      "phone": true, 
      "username": true 
     } 
    } 
} 

然後在我的用戶對象我的新的驗證規則是:

"$other": { 
    ".validate": "root.child('rules/users/fields/'+$other).val() === true" 
} 

我的問題是:這是限制字段名以正確的方式?

非常感謝您的回答:)我對Firebase來說很新,但我有很多樂趣嘗試它!

回答

8

要在火力地堡限制的目的是隻具有指定的鍵,請嘗試使用一個額外的通配符的孩子,將匹配沒有指定任何屬性,並拒絕寫,如果它包含這些無與倫比的屬性之一:

"rules": { 
    "users": { 
    "$userid": { 
     ".validate": "newData.hasChildren(['phone', 'username'])", 
     "phone": { 
     ".validate": "newData.isNumber()" 
     }, 
     "username": { 
     ".validate": "newData.isString()" 
     }, 
     "$other": { 
     ".validate": false 
     } 
    } 
    } 
} 
+0

非常感謝Rob! (對於遲到的答案抱歉,我已經立即閱讀,但忘記迴應:() 這是很好的解決方案是的,但它只是意味着所有的潛在(但不是強制性)領域列出。但它實際上是好的: - 我總是有一些基本的驗證(如newData.isString()) - 我已經列出他們,只是在其他地方:) – adrien

相關問題