【问题标题】:Firebase security rule errorFirebase 安全规则错误
【发布时间】:2018-01-25 13:52:01
【问题描述】:

我正在尝试在 firebase 控制台上实施一些 firebase 安全规则。基本上,我有一个收据项目,它由收据 ID 和项目 ID 组成。我正在尝试实施一个规则来检查两个 ID 在插入之前是否存在。

我的收据表结构:

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()"
         }
    }
}

但是,这会导致错误消息指出不能有多个默认规则。我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 是的,这些规则确实无效:不清楚它应该对哪个孩子应用什么验证。但我不确定我是否理解您要验证的 JSON。您能否编辑您的问题以确保前三个 JSON sn-ps 是您希望在数据库中拥有的有效 JSON?
  • @FrankvanPuffelen 例如,我想在添加之前检查要插入到receiptItems 表中的receiptID 和itemID 是否分别存在于receipt 和item 表下。收据 ID 的结构是收据 -> 帐户 ID -> 收据 ID。这些 ID 是唯一的推送 ID。我试图通过删除不相关的细节来简化结构,以便于阅读
  • 您能否编辑您的问题以确保前三个 JSON sn-ps 是您希望在数据库中拥有的有效 JSON?

标签: firebase firebase-realtime-database firebase-security nosql


【解决方案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存在于items节点中,并且receipt_1存在于receipt节点中。

{
  "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()

检查 root/receipts/item_1 是否存在

同样的概念也适用于验证receipt_id

【讨论】:

  • 是的,这就是我想要做的!但是对于收据权,我到达了收据-> accountID->receiptID的级别。那么对于.Validate,它应该变成root.child('receipts/some accountID here')吗?
  • 我会说不,因为 accountID 没有存储在receipt_items 节点中,因此规则无法访问或以任何方式知道那是什么。更重要的是;如果每个帐户可以有多个收据,例如 acct_0/rec_0、acct_0/rec_1,然后是 acct_1/rec_0、acct_1/rec_1,那么 acct_0 中的 rec_0 和 acct_1 中的 rec_0 有什么区别?即您可以在每个帐户中拥有多张收据。
  • 啊,我明白了。那么上面的解决方案就足够了吗?
  • @guest176969 它对我有用!我建议更改您的 /receipts 结构以匹配我的建议 - 如果您需要存储收据所对应的帐户,只需将其添加为子节点;像 /receipts/account_id。试试看,如果这个答案有帮助,请确保接受它,以便对其他人有所帮助。
  • 我明白了,但是假设我上面的结构,建议的解决方案也有效吗?因为我已经基于结构构建了相当多的代码,所以如果我现在要更改结构,将需要进行相当多的更改
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2016-08-19
  • 2020-09-06
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多