将Firestore限制为仅通过身份验证的用户访问

时间:2019-02-04 18:48:25

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

在Firestore规则中将访问限制为仅通过身份验证的用户的实际正确条件是什么? official docs和此处的几个答案都表明您应该使用request.auth.uid != null。我过去曾经使用过它,并且似乎可以使用,但是最近当我在模拟器中测试其他规则时,我注意到当请求未经身份验证时,它会在这种情况下抛出Null value error

在这种情况下,request.auth != null似乎是您应该使用的实际条件,因为它看起来像在模拟器中一样。

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

是哪个?

1 个答案:

答案 0 :(得分:0)

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