【问题标题】:Writing operation fails - firebase database rules写入操作失败 - firebase 数据库规则
【发布时间】:2018-04-12 20:35:02
【问题描述】:

我有以下对象:

const offer = {
  offerInfo: {
    price: '',
    status: 'open',
    message: '',
    ownerUID: '',
    ownerName: '',
    ownerPhoto: '',
    ownerAvgRating: '',
    ownerReviewNumber: '',
  },
  offerMetaData: {
    userHasSeenOffer: false,
    userHasBeenNotified: false,
  }
}

我正在尝试将其发布到以下节点:

updates['jobs/${activeJob.key}/offers/${currentUser.uid}] = offer; 然后firebase.database().ref().update(updates)

如您所见,我使用用户 uid 作为商品本身的 id。

现在当我尝试使用以下规则发布它时,我收到一个权限被拒绝错误,我不知道为什么。

规则:

"jobs": {
  "$job_uid": {
    ".read": "auth !== null",
    "job": {
      ".write": "!data.exists() && root.child('allUsers/serviceUsers/' + auth.uid + '/paymentDetails').exists() || data.exists() && root.child('jobs/' + $job_uid + '/job/owner').val() === auth.uid",
    },
    "offers": {
      "$offer_uid": {
        "offerInfo": {
          ".write": "$offer_uid === auth.uid",
        },
        "offerMetaData": {
          ".write": "root.child('jobs/' + $job_uid + '/job/owner').val() === auth.uid || $offer_uid === auth.uid",
        },
      },
    },
...

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您正在尝试直接写入$offer_uid,但您在该节点上没有任何写入规则,因此它将使用默认值 false。

    为了您当前的写入成功,您可以像这样更改您的规则:

    "$offer_uid": {
        ".write": "$offer_uid === auth.uid",
        "offerMetaData": {
          ".write": "root.child('jobs/' + $job_uid + '/job/owner').val() === auth.uid",
        },
      },
    

    我将写入规则上移了一个节点,直接在$offer_uid 中,而不是分别在两个子节点中。

    另一种选择是保留您的规则并拆分您的写入,以便您写入子节点。

    【讨论】:

    • 还有一个问题!我认为规则会级联意味着第一个写入规则会覆盖第二个?
    • @WalterMonecke 你到底在说什么规则?
    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2018-07-22
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2017-05-28
    • 2020-05-26
    • 2018-08-27
    相关资源
    最近更新 更多