2016-12-18 173 views
0

我目前正在創建Firebase安全規則,以防止用戶將節點設置爲空並刪除該節點中的所有數據。Firebase數據庫刪除安全規則

這是我的架構

{ 
    "folder" : { 
    "item1" : { 
     "dataset1" : { 
     "data1" : 123, 
     "data2" : 456, 
     "data3" : 789 
     } 
    } 
    } 
} 

這是我的規則

{ 
    "rules": { 
    "folder": { 
// users cannot delete items in the node folder 
     ".write": "newData.exists()", 
// item is a variable 
     "$item": { 
     "dataset1": { 
//  dataset1 must have certain nodes and can't be deleted (set to null) 
      ".validate": "data.hasChildren(['data1', 'data2', 'data3']) && newData.exists()", 
      "data1": {".validate": "newData.isNumber()"}, 
      "data2": {".validate": "newData.isNumber()"}, 
      "data3": {".validate": "newData.isNumber()"}, 
//  using the variable $other means any node that isn't data1, data2, data3 is denied 
      "$other": {".validate": false} 
     } 
     } 
    } 
    } 
} 

使用內置的模擬器我得到這些結果:

The write is properly denied and doesn't let user set folder node to null

這工作時,位置設置爲「/ folder/item1」和「/ folder/item1/data」 SET1"

However when location is set to "/folder/item1/dataset1/data1" the write is allowed and the data is deleted.

如果我在Data1有更深層次的節點,他們將全部被刪除,因爲寫是允許的。

感謝您閱讀。打開任何答案,最好我不需要更改架構。

回答

0

我不清楚你在問什麼。但是你的規則存在一些問題,所以我只是指出那些希望他們回答你的問題。

  1. 您授予/folder的寫入訪問權限,您無法在較低級別上將其刪除。
  2. 只要有任何數據仍在/folder之下,則允許進行任何寫入。需要記住的一點是,newData是該位置處的數據,因爲在寫入操作後它將存在;它不僅僅是寫入的新數據。
  3. 我的印象是你試圖阻止.validate規則的刪除。請記住,刪除數據時不會執行驗證,因此您不能使用.validate規則來防止刪除。

我懷疑#2是造成你目前的問題。

+0

嗨,我在第2點使用了你的建議。我用「newData.hasChildren([example,example])」來確保這些孩子不能被刪除。謝謝你的幫助! –