Firebase实时安全性-编写一些逻辑规则

时间:2020-04-24 16:03:17

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

我是这里的新用户,希望我能按预期写出问题。

我有一个实时数据库,其中包含:

  1. 参与者(他们具有customClaim:partner = true)
  2. 主机
  3. 战斗。

战斗是从hostId或参与者ID到他的战斗的对象。 每场战斗都包含:hostId,参与者ID,isApproved和主持人的电话号码。

添加战斗后,我将向主机和参与者添加战斗。 在每次战斗中,我都有一些规则:

阅读规则:

  1. 只有登录的用户才能从数据库中读取。
  2. 主持人可以阅读他的战斗,参与者可以阅读他的战斗。
  3. 此外,主持人可以阅读参与者的战斗(fights / participantId)。他可以获取除电话号码以外的所有数据(因为它可以是另一台主机的电话号码)。

编写规则:

  1. 只有登录的用户才能写入数据库。
  2. 主持人可以对自己和战斗中发现的参与者ID进行打架,而写数据的主持人应在hostId中找到。
  3. 参与者可以自己和自己在战斗中找到的hostId进行战斗,而编写数据的参与者应该在particatorId中找到。
  4. 只有参与者可以设置isApprove。

请注意,主持人不能邀请其他主持人。 以下是一些示例:

在主机表中找到“ h#”,在参与者表中找到“ p#”。

有效:

  • h1 / p1读了他的战斗。
  • h1尝试读取p1搏斗(他应该获取所有p1事件的数据,但每次搏斗中的电话号码除外)。
  • h1尝试为自己和p1编写战斗,但战斗不包含isApprive。
  • p1可以更改isApprove
  • --

无效:

  • h1尝试阅读h2的战斗。
  • h1尝试通过属性hisApprove = true为自己/参与者增加战斗。
  • h1尝试向h2和参与者添加战斗
  • h1使用host = h2将战斗添加到他/参与者表中(他必须是主持人)。

所以战斗看起来像:

Fights: {
    hostId1: {
       fightId1: {
           hostId: hostId1,
           participantId: participantId1,
           isApproved: false,  
           phoneNumber: "123"
        },
    },
    hostId2: {...},
    participantId1: {
       fightId1: {
           hostId: hostId1,
           participantId: participantId1,
           isApproved: false,  
           phoneNumber: "123"
        },
        fightId2: {
           hostId: participantId1,
           participantId: participantId1,
           isApproved: true,  
           phoneNumber: ""
        },
    },
    admin2: {...}
}

我试图编写这些规则,但需要一些帮助,导致“数据库中较浅的.read和.write规则会覆盖较深的规则”。

我认为我需要使用一些规则:

用户已登录:

auth != null

主持人/参与者战斗的密钥应显示在hostId或参与者ID中:

($uid === newData.child('hostId').val() || $uid === newData.child('participantId').val())

写入数据的用户应显示在hostId或参与者ID中:

(auth.uid === newData.child('hostId').val() || auth.uid === newData.child('participantId').val())

参与者ID应该在参与者表中找到:

root.child('participants').child(newData.child('participantId').val()).exists()"

只有参与者可以更改isApprove

auth.admin === true || newData.child('isApprove').exists() === false

有人可以帮我写这些规则吗?

任何帮助表示赞赏!

0 个答案:

没有答案