【问题标题】:Firebase database security rule, check auth.email in resource.dataFirebase数据库安全规则,检查resource.data中的auth.email
【发布时间】:2020-10-18 09:57:35
【问题描述】:

错误 [firebase.firestore] FirebaseError:权限缺失或不足。

我有一个允许少数用户更新的对象。管理员将设置他们的电子邮件,这些使用这些电子邮件登录的用户将被允许更新。

这些是我尝试过的规则:

allow update: if request.resource.data.managerEmails.val().contains(request.auth.email) && request.resource.data.id == resource.data.id;

allow update: if request.resource.data.managerEmails.contains(request.auth.email) && request.resource.data.id == resource.data.id;

allow update: if request.resource.data.managerEmails.includes(request.auth.email) && request.resource.data.id == resource.data.id;

要更新的资源:

{
  id: "someid",
  ...fields,
  managerEmails: "abcde@email.com,anothermanager@email.com",
}

正在更新的用户身份验证:

{
  uid: "rSTLnYD9aisyZJHQPC6sg7mlsZh1",
  email: "abcde@email.com",
  ...
}

更新: 使用request.auth.uid 一直在其他规则中工作,但在这种情况下,我必须使用电子邮件,因为用户可能还没有注册。

使用规则游乐场,我得到Property email is undefined on object. 也许使用request.auth.email 是不可能的?

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

    我遇到了同样的问题,但从使用 firebase.auth.email 切换到 firebase.auth.token.email 并且现在可以正常工作了。

    【讨论】:

      【解决方案2】:

      我强烈建议做两件事。

      首先,存储 UID 而不是电子邮件地址。 UID 是识别单个 Firebase 身份验证帐户的首选方式,并且始终保证存在且是唯一的。电子邮件地址不是。

      其次,将用户列表存储为数组类型字段,而不是逗号分隔的字符串。这将更容易管理。

      做完这两件事,规则就简单了:

      allow update: if resource.data.managerUids.hasAny([request.auth.uid]);
      

      【讨论】:

      • 感谢您的建议。我需要使用电子邮件,因为这些用户可能尚未在系统中注册(他们的用户还不存在)。我已按照您的建议将其更改为一系列电子邮件,而不是逗号分隔。并改成resource.data.managerEmails.hasAny([request.auth.email]),也不行。
      • 使用规则游乐场,我得到Property email is undefined on object. 可能无法使用电子邮件?
      • 控制台中的模拟器不支持。您将不得不编写代码以查看它是否有效。
      猜你喜欢
      • 2016-09-16
      • 2021-08-16
      • 2019-12-17
      • 1970-01-01
      • 2021-10-22
      • 2020-08-08
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多