写入操作失败 - firebase数据库规则

时间:2018-04-12 12:06:39

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

我有以下对象:

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",
        },
      },
    },
...

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

对于你当前的写作成功,你可以改变你的规则:

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

我直接在$offer_uid中将写规则向上移动了一个节点,而不是在两个孩子中单独使用它。

另一个选择是保留你的规则并分割你的写,这样你就可以写入子节点了。