【问题标题】:Restrict Firestore access to authenticated users将 Firestore 访问权限限制为经过身份验证的用户
【发布时间】:2019-06-28 13:37:21
【问题描述】:

在 Firestore 规则中使用什么实际正确条件来限制只有经过身份验证的用户才能访问? official docs 和这里的几个答案说你应该使用request.auth.uid != null。我过去使用过它,它似乎可以工作,但最近当我在模拟器中测试其他一些规则时,我注意到当请求未经身份验证时,它会在这种情况下抛出 Null value error

如果是这种情况,request.auth != null 似乎是您应该使用的实际条件,因为它在模拟器中的行为似乎符合预期。

这是模拟器与规则的实际行为之间的差异吗?如果模拟器是正确的,我假设request.auth.uid != null 条件仅“有效”,因为默认行为是在条件出现错误时拒绝访问。另一种选择是模拟器是错误的,request.auth 在实际使用数据库时永远不会是null

这是什么?

【问题讨论】:

  • 你为什么说指示的问题在实践中不起作用?
  • @AlexMamo 我这么说是因为它似乎表明情况确实如此,而我自己没有进行全面测试的更改。但是,我已经测试过,它似乎确实有效,并且文档和大多数答案实际上都是错误的。
  • 他们更新了文档(至少是示例),更喜欢 request.auth != null。

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


【解决方案1】:

我在几个不同的条件下进行了一些测试,发现我的假设似乎是正确的——request.auth.uid != null 条件是“有效的”,因为它在用户未经身份验证时会引发错误。在大多数情况下,这可能不会导致任何问题,因为您可能无论如何都想拒绝访问;但是,如果您尝试编写相反的条件request.auth.uid == null,它确实会导致问题。由于在未经身份验证时会引发错误,因此还会导致规则拒绝访问。

我的结论是文档在技术上是不正确的,应该用来检查用户是否通过身份验证的条件是request.auth != null。您可以在下面看到我的测试结果,错误行为以粗体显示。

测试

文档中描述的访问限制:

allow read, write: if (request.auth.uid != null);
  • 已通过身份验证 - 允许访问
  • 未经身份验证 - 访问被拒绝

备用访问限制:

allow read, write: if (request.auth != null);
  • 已通过身份验证 - 允许访问
  • 未经身份验证 - 访问被拒绝

逆限制(文档条件):

allow read, write: if (request.auth.uid == null);
  • 已通过身份验证 - 访问被拒绝
  • 未经身份验证 - 访问被拒绝

逆限制(替代条件):

allow read, write: if (request.auth == null);
  • 已通过身份验证 - 访问被拒绝
  • 未经身份验证 - 允许访问

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2010-10-07
    • 1970-01-01
    • 2010-09-21
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多