Firebase实时规则-当某个子项包含值x时是否授予访问权限?

Firebase实时规则-当某个子项包含值x时是否授予访问权限?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,一段时间以来,我一直试图让这条规则发挥作用,但我似乎无法理解它 我的数据结构如下: games { *gameid* { gamecode: *some gamecode* players { 0 { playerId: *some playerid* } 1 { playerId: *some playerid*

一段时间以来,我一直试图让这条规则发挥作用,但我似乎无法理解它

我的数据结构如下:

 games { 
    *gameid* {
        gamecode: *some gamecode*
        players {
           0 {
              playerId: *some playerid*
             }
           1 {
              playerId: *some playerid*
             }
           etc.
        }
        etc.
    }
所以基本上我有游戏,每个游戏都有一个唯一的id,包含以下数据:游戏代码、玩家列表和更多数据。问题是,我只希望游戏玩家列表中的玩家有权读取该游戏的所有玩家,而不仅仅是他们自己

我认为这需要某种第二个通配符,但我似乎无法在firebase规则中找到这是否可行

以下是我提出的最接近解决方案的方法:

"games": {
      "$gid": {
        "players": {
            ".read": "auth.uid != null && data.child('$uid').child('playerId').val() === auth.uid",
            ".write": false
        }
      }
    } 
这不起作用,可能是因为它使用“$uid”作为实际id而不是通配符。当我用播放器的实际键替换它时,它确实起作用了

有人知道我是否能做到这一点,以及如何做到这一点吗?提前谢谢

编辑:


我决定使用uid作为播放机的实际键,并使用data.child(auth.uid).exists()检查播放机是否存在。

我认为您不能使用这样的通配符

一种解决方案是手动查找“任何地方”,如下所示:

"auth.uid == data.child('0/playerId').val() ||
 auth.uid == data.child('1/playerId').val() ||
 auth.uid == data.child('2/playerId').val()" // up to max allowed players
 games { 
    *gameid* {
        gamecode: *some gamecode*
        players {
           0 {
              playerId: *some playerid*
             }
           1 {
              playerId: *some playerid*
             }
           etc.
        }
        playerIds {
           somePlayerId: true
           someOtherPlayerId: true
        }
    }
或者,您可以将数据结构修改为以下内容:

"auth.uid == data.child('0/playerId').val() ||
 auth.uid == data.child('1/playerId').val() ||
 auth.uid == data.child('2/playerId').val()" // up to max allowed players
 games { 
    *gameid* {
        gamecode: *some gamecode*
        players {
           0 {
              playerId: *some playerid*
             }
           1 {
              playerId: *some playerid*
             }
           etc.
        }
        playerIds {
           somePlayerId: true
           someOtherPlayerId: true
        }
    }
所以你可以简单的做

"data.parent().child('playerIds/'+auth.uid).exists()"
在不大幅更改代码的情况下(您仍然可以使用
players
作为数组)

或者可以完全放弃阵列:

 games { 
    *gameid* {
        gamecode: *some gamecode*
        players {
           somePlayerId {
              index: 0
              playerId: *some playerid*
             }
           someOtherPlayerId {
              index: 1
              playerId: *some other playerid*
             }
           etc.
        }
    }
规则变成了

"data.child(auth.uid).exists()"
(我还没有测试这些,请注意拼写错误)