Firebase 规则允许访问基于电子邮件地址的路径

Firebase rules to give access to a path based on email address

我正在编写一个可以邀请用户加入家庭的应用程序。一旦用户接受,他们就会成为会员。

数据如下所示:

families: {
   familyKey1: {
      name: "First Family Name"
   },
   familyKey2: {
      name: "Second Family Name"
   },
},
invites: {
   inviteKey1: {
      familyKey: "familyKey1",
      email: "user@domain.tld"
   }
},
users: {
   uid1: {
      familyKey: "familyKey2"
   }
}

如果满足以下条件,我希望登录用户能够访问 /families/familyKeyX/ 路径:

  1. familyKeyX 存在 /users/uidX/ 当前登录的用户。
  2. /invites/inviteKeyX/ 下有一个邀请,其中电子邮件与当前登录的用户匹配并且邀请包含 familyKeyX

第一部分通过创建如下规则工作正常:

"families": {
   "$familyKey": {
      ".read": "root.child('users').child(auth.uid).child('familyKey').val() == $familyKey"
   }
}

第二部分我无法开始工作。如果我可以 post 电子邮件作为对象路径的一部分,它可以以相同的方式设置,但 firebase 不允许 @ 符号,所以我不得不生成 inviteKey .但是当我编写规则时该密钥是未知的并且 firebase 不允许在规则路径上搜索或通配符。

我正在考虑制作路径 {"invites": { "familyKeyX": { "email": "user@domain.tld"} } }。但这是不行的,因为它只允许每个家庭收到一次邀请。可能有多个用户使用不同的电子邮件发送待处理邀请。一旦我引入一个唯一的密钥来形成一个邀请列表我不知道写规则的路径...

我该如何解决这个问题?

在 Firebase 安全规则中,您可以 read/check 数据库中已知路径的数据。但是,您不能在数据库中的特定路径下搜索数据。

所以在代码中你可以这样做:

root.child("invites").orderBy("email").equalTo("user@domain.tld")

此查询的等效项在安全规则中不可能


为了能够查找给定的电子邮件是否可以访问家庭,您需要将用户的电子邮件地址作为键存储在单独的映射中。由于 . 不允许在密钥内使用,因此您必须对其进行编码 - 通常通过将其替换为 , 允许在密钥中且方便不能出现在电子邮件地址中。

所以:

emailToInvites: {
   "user@domain,tld": {
      "familyKey1": "inviteKey1"
   }
},

现在有了这个,您可以在电子邮件地址中 replace . with ,,然后使用它来查找 emailToInvites 下是否存在邀请。