推送对象的实时数据库规则

时间:2017-09-30 13:46:46

标签: firebase-realtime-database firebase-security

我有一个实时数据库,它将以下结构的对象推送到数据库中。

Teams
- 0
-- Players
--- 0
---- ID
--- 1
---- ID
- 1
--- 0
---- ID
--- 1
---- ID

基本上,有两支球队,每支球队最多有两名球员,每名球员都有一名身份证。保存游戏后,游戏对象将被推送到数据库。我可以从/ games / [unique-ID-generated-by-pushing]

获取游戏数据

目前,我所有(经过身份验证的)用户都能够阅读/ games下的所有数据。我想限制这一点:用户只能看到他们参与的游戏。

我设法用我的规则做到这一点。

{
  "rules":
  {
    "games":
    {
      "$match_id":
      {
    ".read": "data.child('$match_id').child('teams').child('0').child('players').child('0').child('ID').val() == auth.uid ||
        data.child('$match_id').child('teams').child('0').child('players').child('1').child('ID').val() == auth.uid ||
        data.child('$match_id').child('teams').child('1').child('players').child('0').child('ID').val() == auth.uid ||
        data.child('$match_id').child('teams').child('1').child('players').child('1').child('ID').val() == auth.uid"
      },
    }
  }
}

它并不优雅,但在我查询/游戏/ [unique-ID]时有效。我似乎没有从/ games引用中获取任何DataChanged事件,但这是我需要的。

知道我怎么能从这里出发吗?或者如果可能的话?

1 个答案:

答案 0 :(得分:0)

如果您只想允许对该游戏中的玩家进行游戏读取访问,那么在您当前的数据结构中这样的内容应该足够了:

{
  "rules": {
    "games": {
      "$match_id": {
      ".read": "data.child('teams/0/players/0/ID').val() == auth.uid ||
                data.child('teams/0/players/1/ID').val() == auth.uid ||
                data.child('teams/1/players/0/ID').val() == auth.uid ||
                data.child('teams/1/players/1/ID').val() == auth.uid"
      },
    }
  }
}

您的规则变更:

  • child($match_id)似乎是个错误,所以我删除了它。
  • 您可以将整个路径传递给child,这会使规则缩短很多。

如果您想要更简单的规则,请考虑为游戏保留一个(额外)更简单的所有玩家列表:

games
  gameid1
    players
      player1id: true
      player2id: true
      player3id: true
      player4id: true

然后读取规则可以是单个子句:

{
  "rules": {
    "games": {
      "$match_id": {
      ".read": "data.child('players').child(auth.uid).exists()"
      },
    }
  }
}

在这种情况下,基本上你会为更复杂的数据交易更简单的代码/规则。