Firebase 按预期拒绝 PermissionDenied 更新,但监听节点的客户端仍然接收到发送的数据
Firebase rejects update with PermissionDenied as expected but still the client listening to the node receives the data sent
我正在监听实时数据库中的一个节点,并且发送了一个不应通过安全规则的多路径更新。应该通过写入规则而不是验证规则。
检查 firebase 控制台,没有按预期写入任何内容。但是使用 onChildAdded 监听其中一个节点的客户端接收到发送的数据。
是否可能没有任何内容提交到数据库,但仍然在客户端触发 onChildAdded?
我认为这是不可能的,但也许我遗漏了一些关于规则验证 + 多路径更新的内容。
在控制台上打印收到的事件:
event: Instance of 'QueryEvent' | event.snapshot: Instance of 'DataSnapshot' | event.snapshot.val: {c: true, m: e3, n: 1} [2021-08-31T18:14:33.230Z] @firebase/database: FirebaseError: PERMISSION_DENIED: Permission denied (PERMISSION_DENIED)
发送的数据,我是这样进行多路径更新的:
Map<String, dynamic> updateToSend = {};
updateToSend["status/c"] = move.c;
updateToSend["status/n"] = move.n;
updateToSend["moves/${move.n}/n"] = move.n;
updateToSend["moves/${move.n}/m"] = move.m;
updateToSend["moves/${move.n}/c"] = move.c;
await fb.database().ref('games/$gameID').update(updateToSend);
听众:
final movesRef = fb.database().ref("/games/${gameId}/moves");
final streamMoves = movesRef.onChildAdded;
streamMoves.listen((event) {
print(
"event: $event | event.snapshot: ${event.snapshot} | val: ${event.snapshot.val()}");
...
}
在执行写入操作的客户端上,受影响路径的侦听器会立即触发 - 甚至在数据发送到服务器之前。如果写入被服务器拒绝,SDK 实际上会触发协调事件以确保应用可以再次处于正确的状态。
因此:如果您 也 收听 onChildRemoved
流,一旦服务器拒绝写入操作,您将在那里收到一个事件。这使您可以再次将其从 UI 中删除。无法阻止获取初始本地事件。
我正在监听实时数据库中的一个节点,并且发送了一个不应通过安全规则的多路径更新。应该通过写入规则而不是验证规则。
检查 firebase 控制台,没有按预期写入任何内容。但是使用 onChildAdded 监听其中一个节点的客户端接收到发送的数据。
是否可能没有任何内容提交到数据库,但仍然在客户端触发 onChildAdded?
我认为这是不可能的,但也许我遗漏了一些关于规则验证 + 多路径更新的内容。
在控制台上打印收到的事件:
event: Instance of 'QueryEvent' | event.snapshot: Instance of 'DataSnapshot' | event.snapshot.val: {c: true, m: e3, n: 1} [2021-08-31T18:14:33.230Z] @firebase/database: FirebaseError: PERMISSION_DENIED: Permission denied (PERMISSION_DENIED)
发送的数据,我是这样进行多路径更新的:
Map<String, dynamic> updateToSend = {};
updateToSend["status/c"] = move.c;
updateToSend["status/n"] = move.n;
updateToSend["moves/${move.n}/n"] = move.n;
updateToSend["moves/${move.n}/m"] = move.m;
updateToSend["moves/${move.n}/c"] = move.c;
await fb.database().ref('games/$gameID').update(updateToSend);
听众:
final movesRef = fb.database().ref("/games/${gameId}/moves");
final streamMoves = movesRef.onChildAdded;
streamMoves.listen((event) {
print(
"event: $event | event.snapshot: ${event.snapshot} | val: ${event.snapshot.val()}");
...
}
在执行写入操作的客户端上,受影响路径的侦听器会立即触发 - 甚至在数据发送到服务器之前。如果写入被服务器拒绝,SDK 实际上会触发协调事件以确保应用可以再次处于正确的状态。
因此:如果您 也 收听 onChildRemoved
流,一旦服务器拒绝写入操作,您将在那里收到一个事件。这使您可以再次将其从 UI 中删除。无法阻止获取初始本地事件。