2017-08-17 135 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