是否可以使用通配符在 firebase 安全规则中引用其他节点中的数据?

Is it possible to reference data in other nodes in firebase security rules using wildcards?

我知道可以使用通配符在同一节点中进行引用:

statistics: {
     "$uid" : {
          ".read": "($uid === auth.uid)"
      }
}

但是,如果我必须使用通配符添加对其他一些节点的引用怎么办,例如:

statistics: {
  .read = "root.child('users').child(//wildcard for unique ids).child('uid').val() == auth.uid"
}

我认为您正在尝试检查 users 集合中是否有任何节点具有用户的 uid。这不可能。安全规则只能访问特定节点,不能搜索它们。

典型的解决方案是添加一个倒排集合,其中uid是键:

usersByUid
  <uid1>: ...
  <uid2>: ...

使用这样的结构,您可以使用以下方法检查密钥是否存在:

.read = "root.child('usersByUid').child(auth.uid).exists()"

一般来说,建议将用户存储在 uid 而不是其他键下。