2014-01-12 8 views
0

如果你看一下fredRef例如在https://www.firebase.com/docs/security/security-rules.html(在頁面底部):Firebase安全性 - 當您在Firebase上驗證孩子時,是否需要每組數據中的所有數據?

他們說,因爲它不具備「最後一個」孩子第一fredRef.set()會失敗。然後他們設定第一個和最後一個,並說它會成功。

所以我的問題是這樣的:

將執行完全相同的線作爲第一fredRef.set()的第二fredRef.set()之後,成功或失敗,因爲該組本身並不擁有所有的數據?

回答

1

簡短的回答是否定的,除非您正在編寫的數據包含第一個/最後一個鍵,否則您將無法在任何時間寫入數據。

但是,這可能不是很清楚,因爲在文檔中似乎有一個小小的錯誤。安全規則的編寫方式如下:

{ 
    ... 
    "name": { 
    // existing data must have first/last keys before write is allowed 
    // since validate rule is not applied to delete ops, this record can be deleted 
    ".validate": "data.hasChildren(['first', 'last'])" 
    "first": { ... } 
    "last": { ... } 
    // no keys other than first/last may be written 
    "$other": { 
     ".validate": false 
    } 
    } 
} 

在這種情況下,如果你能以某種方式得到一個姓氏和名字到記錄(比如作爲管理員),在此之後的任何寫操作將被允許,無論是否有第一個/最後一個。但是,這看起來像一個錯字。而是指data variable,可呈現引用現有數據,我認爲這是意指newData variable,或數據被寫入,像這樣:

// data to be written must have first/last keys before write is allowed 
// since validate rule is not applied to delete ops, this record can be deleted 
".validate": "newData.hasChildren(['first', 'last'])" 

在這一點上,newData(什麼你寫到那個路徑)必須有第一個/最後一個名字。這也假設在層次結構中存在允許寫入訪問的「.write」規則。

這條規則是高一點了教程:

// any authenticated user can write to their own record 
".write": "$user == auth.username", 
+0

這看起來並不像一個錯字都沒有。與「其他」規則相結合意味着我最初發布的問題會成功,因爲它不是在查看newData,而是數據(最初我錯過了一點)。 「$ other」規則消除了將垃圾數據放入其中的可能性(這並不在示例中,而應該是這樣),但允許更新名字或姓氏而不更新兩者,這正是我想要的知道。 –

+0

正確,但通過查看數據,它永遠不會允許您首先寫入記錄(除非它是由某個管理進程寫入的);你幾乎不能寫一個記錄,除非它已經有第一個/最後一個。 – Kato

+0

我想出了允許更新單個項目和創建項目本身的正確語法。'「.validate」:「data.hasChildren(['action'])|| newData.hasChildren(['action']) 「,」如果這種方法能夠消除兩次基本相同功能的樣板,那將會很好。 –

相關問題