Firebase 在Firestore中,安全规则是否在集合快照更新之前生效?

Firebase 在Firestore中,安全规则是否在集合快照更新之前生效?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我在一个集合上有一个where表达式,并收听更新。我使用完全相同的表达式授予读取权限。当where条件不再适用于文档时,我希望将其从快照中删除,但会抛出一个引用权限规则的异常 我的规则是这样的 match /arenas/{arenaId}/channels/{channelId} { allow read : if (request.auth.uid in resource.data.members); } ref .collection("channels") .wh

我在一个集合上有一个where表达式,并收听更新。我使用完全相同的表达式授予读取权限。当where条件不再适用于文档时,我希望将其从快照中删除,但会抛出一个引用权限规则的异常

我的规则是这样的

match /arenas/{arenaId}/channels/{channelId} {
  allow read :  if (request.auth.uid in resource.data.members);
}
ref
    .collection("channels")
    .where("members", "array-contains", uid)
    .onSnapshot(snapshot => {
我的侦听器是这样设置的

match /arenas/{arenaId}/channels/{channelId} {
  allow read :  if (request.auth.uid in resource.data.members);
}
ref
    .collection("channels")
    .where("members", "array-contains", uid)
    .onSnapshot(snapshot => {
当我从特定频道的
members
中提取
id
时,where表达式不再适用于该特定频道。我得到的不是通知我通道已删除的更新,而是异常

这是预期的行为,还是我犯了错误


如果是预期的,正确的实现是什么,或者我如何解决它?

这是预期的行为。如果在任何时候条件发生更改,导致安全规则拒绝新查询,则该查询的任何现有侦听器都将立即被拒绝,并出现错误。就安全规则而言,监听者不能生活得太过受欢迎


我不能推荐一个“正确”的实现,因为如果侦听器失败,您必须自己弄清楚该怎么做。也许您可以在更正UID列表后再次尝试查询。

谢谢。我实际上希望这是一个常见的用例。“读取我所属集合中的所有文档,并拒绝对其余文档的任何访问”这是不可能的,因为安全规则不是过滤器。查询必须与规则的约束完全匹配。读这个:没错。在我的案例中,规则和过滤器是完全匹配的。过滤器会检查用户id是否在列表中,安全规则也会检查。但是你说资源已更改,不再与查询匹配?啊,糟糕的解释:我通过从成员列表中删除用户id来更改资源。然后where表达式应该过滤掉资源,这样就不必引入安全性。