2017-08-17 166 views
0

我試圖在Firebase控制檯上實施一些Firebase安全規則。基本上,我有一個收據項目,它由收據ID和項目ID組成。我試圖實現一個規則來檢查插入前兩個ID是否存在。Firebase安全規則錯誤

我的收據表結構:

receipts { 
    accountID { 
     receiptID {} 
    } 
} 

的項目表結構:用於接收物品

items { 
    itemID {} 
} 

表結構:

receiptItems { 
    receiptItemID { 
     itemID, receiptID 
    } 
} 

到目前爲止,我所取得的成就:

"receiptItems": { 
    "$receiptItemID" : { 
     "$receiptID" : { 
      ".validate": "root.child('receipts/' + $receiptID).exists()" 
     }, 
     "$itemID" : { 
      ".validate": "root.child('items/' + $itemID).exists()" 
     } 
    } 
} 

但是,這導致錯誤消息說不能有多個默認規則。我怎樣才能做到這一點?

謝謝!

+0

呀,這些規則確實是無效的:它目前還不清楚它應該適用於什麼樣的孩子什麼驗證。但我不確定我是否理解您要驗證的JSON。你能編輯你的問題,以確保前三個JSON片段是你想在數據庫中有效的JSON嗎? –

+0

@FrankvanPuffelen例如,我想要檢查收款人和物品ID分別存在收據和物品表之前是否將收入ID和物品ID插入到收款物品表中。 receiptID的結構是receipt - > accountID - > receiptID。這些ID是唯一的推送ID。我試圖通過刪除無關詳細信息來簡化結構以簡化閱讀 – guest176969

+0

您是否可以編輯您的問題以確保前三個JSON片段是您希望在數據庫中有效的JSON? –

回答

1

我想我得到了這個,但你的JSON結構有點不清楚,所以讓我提供我的解釋。

items 
    item_0 
    item_data: "some data about item 0" 
    item_1 
    item_data: "some data about item 1" 

receipts 
    receipt_0 
    receipt_data: "data about receipt 0" 
    receipt_1 
    receipt_data: "data about receipt 1" 

receipt_items 
    receipt_item_0 
    item_id: "item_0" 
    receipt_id: "recept_0 

現在假設我要編寫項目1,收到1新receipt_item節點,它應該是這樣的:

receipt_item_1 
    item_id: "item_1" 
    receipt_id: "recept_1 

規則需要驗證ITEM_1存在於項目節點和receipt_1存在於收據節點中。

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
    "receipt_items": { 
     "$ri": { 
     ".validate": "root.child('items').child(newData.child('item_id').val()).exists() 
     && 
     .validate": "root.child('receipts').child(newData.child('receipt_id').val()).exists()" 
     } 
    } 
    } 
} 

注意驗證規則是一個長字符串 「.. & &。」 - 我打破了它在三線可讀性

從裏面走出去:

newData.child('item_id').val() 

獲取傳入數據子節點「item_id」的值,在此情況下爲item_1

root.child('receipts').child('item_1').exists() 

檢查,如果根/收據/ ITEM_1存在

同樣的概念適用於驗證receipt_id

+0

是的,這就是我想要做的!但對於收據的權利,我到了那裏是收據水平 - > accountID - > receiptID。所以.Validate,它應該成爲root.child('收據/一些accountID這裏')? – guest176969

+0

我會說沒有,因爲accountID沒有存儲在receipt_items節點中,所以規則將無法訪問或以任何方式知道它是什麼。更重要的是;如果每個帳戶可以有多個收據,例如acct_0/rec_0,acct_0/rec_1,然後是acct_1/rec_0,acct_1/rec_1區分acct_1中的rec_0和acct_1中的rec_0?即您可以在每個帳戶中擁有多個收據。 – Jay

+0

啊,我明白了。那麼上面的解決方案就足夠了? – guest176969