我有一个实时数据库,它将以下结构的对象推送到数据库中。
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事件,但这是我需要的。
知道我怎么能从这里出发吗?或者如果可能的话?
答案 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()"
},
}
}
}
在这种情况下,基本上你会为更复杂的数据交易更简单的代码/规则。