2017-07-06 112 views
0

我想確保我的firebase數據庫允許創建新記錄,但不允許刪除現有記錄。最終,我計劃在我的應用中使用Firebase身份驗證,並允許用戶更新現有記錄(如果他們是作者),但我試圖首先讓這個簡單案例工作。Firebase數據庫規則 - `data.exists()`似乎總是如此,可能的錯誤?

但是!不管我在數據庫規則模擬器中嘗試什麼,儘管文檔seems to suggestdata.exists()的值似乎總是如此。從我從the documentation中可以理解的內容可知,變量data代表數據庫中的記錄,與操作發生之前一樣。也就是說,對於創建,data不存在,並且對於更新/刪除,data將引用存在於數據庫中的真實記錄。 這似乎並沒有這樣的情況,到了那裏我居然懷疑一個bug在火力地堡,因爲在我的數據庫中設置以下規則當點,所有的寫操作是不允許的

{ 
    "rules": { 
    ".read": true, 
    ".write": "!data.exists()" 
    } 
} 

無無論我將什麼值放入模擬器,無論是位置還是數據。我甚至寫了一個小的EmberJS應用程序來驗證模擬器是否說出了真相,並且它也被拒絕了所有寫入操作的許可。

我真的不知道該從哪裏出發,因爲我幾乎無法嘗試。我嘗試刪除數據庫中的所有記錄,這可以讓模擬器認爲它可以執行寫入操作,但是我的測試應用程序仍然獲得PERMISSION_DENIED,所以我不知道是什麼導致了這裏的不一致。

是我對預定義的data變量的理解是否正確?如果是這樣,爲什麼我不能寫出我想要的規則?我看到snippets字面上試圖達到我的「創造唯一,不刪除」規則,似乎與我的理解相符。

最後說明:我正在嘗試在一個全新的Firebase項目中使用上面的規則,並且只有〜少數記錄我的數據庫周圍的垃圾數據。

回答

2

由於您已將!data.exists()置於數據庫的根目錄位置,因此data指向整個數據庫。只有當數據庫完全清空時才能寫入數據庫。

您表示您只用運行測試,在我的數據庫周圍放置了一些垃圾數據記錄。這些記錄將導致data.exists()爲真。

您可以通過將!data.exists()規則放置在樹中您想要求沒有數據存在的特定位置來實現您的目標。這通常在帶有通配符鍵的位置完成,如在您鏈接的示例中:

{ 
    "rules": { 
    // default rules are false if not specified 

    "posts": { 
     ".read": true, // everyone can read all posts 

     "$postId": { 
     // a new post can be created if it does not exist 
     // existing posts can only be edited by their original "author" 
     ".write": "!data.exists() && newData.exists() || data.child('author').val() == auth.uid", 
     ".validate": "newData.hasChildren(['title', 'author', 'timestamp'])", 
     } 
    } 
    } 
} 
+0

嗨,感謝您的回覆。這是我理解中的缺失部分,我顯然沒有正確解析文檔。我實現了像這樣的變化,現在一切都按預期工作100%。我假定「數據」是一種神奇解決的變量,它是根據您的要求推斷的,而不是基於規則本身。謝謝! – Peabnuts123