firebase - 限制经过身份验证的用户访问 Firestore

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

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

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

这是什么?

最佳答案

我在几个不同的条件下做了一些测试,发现我的假设似乎是正确的——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);
  • 已通过身份验证 - 访问被拒绝
  • 未经身份验证 - 允许访问

https://stackoverflow.com/questions/54522477/

相关文章:

c# - 如何生成包含 JSON 结构的要下载的文件?

macos - Homebrew/brew 在安装 gnuplot 时没有选择选项

python - 替换 Pandas 数据框中的点

ruby-on-rails - 使用 RubyZip 生成文件并下载为 zip

google-maps - 如何使 flutter google map 中的标记随相机而不是 ma

python - Django 获取一个月中每一天的对象数

r - 如何在绘图中制作垂直线段?

react-native - 如何从 react-native 代码中禁用 Android 默认 "

angular - NGRX Store adapter.updateone 不更改属性以进行更改检

python - MPI4Py comm.Barrier() 没有阻塞 MSMPI?