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()"
(我还没有测试这些,请注意拼写错误)