Firebase安全规则 - 尝试从树节点中删除数据时权限被拒绝

时间:2017-10-27 06:16:02

标签: firebase firebase-security

我一直在努力解决一些firebase安全规则。我已经能够在节点上添加/更新数据,但我无法将其删除。以下是我的节点的规则:

"auditions": {
        ".read": "auth !== null",
        "$auditionId": {
         "_geoloc": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "band_id": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "creator_id": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "date_created": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "date_last_updated": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "genres": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "instruments": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "is_deleted": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "objectID": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "type": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "videos": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "audition_id": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "is_new": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "message": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "status": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "user_id": {
           ".write": "auth !== null && (!data.exists() || !newData.exists() || (data.parent().hasChild('user_id') && data.parent().child('user_id').val() === auth.uid) || (newData.parent().hasChild('user_id') && newData.parent().child('user_id').val() === auth.uid) || (data.parent().hasChild('creator_id') && data.parent().child('creator_id').val() === auth.uid) || (newData.parent().hasChild('creator_id') && newData.parent().child('creator_id').val() === auth.uid))"
         },
         "applications": {
           ".write": "auth !== null"
         }
        }
      }

我以这种方式进行设置,因为除了$auditionId之外,applications的所有子节点都需要一些更复杂的规则。

我在指定$auditionId的各个子节点时是否出现了问题?当我去删除应用中的数据时,我收到PERMISSION_DENIED错误?

1 个答案:

答案 0 :(得分:1)

  

我想限制对试镜创作者的写入/更新/删除,除非更新/auditions/$applicationId/applications

听起来像是:

auditions": {
    ".read": "auth !== null",
    "$auditionId": {
        ".write": "auth !== null && (
          (data.exists() && data.child('user_id').val === auth.uid) ||
          (!data.exists() && newData.child('user_id').val() === auth.uid)
        )",
        "applications": {
            ".write": true
        }
    }
}