将Firestore访问权限限制为经过身份验证的用户



在Firestore规则中使用什么实际的正确条件来限制仅对经过身份验证的用户的访问?这里的官方文档和几个答案都说你应该使用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);
  • 已通过身份验证-访问被拒绝
  • 未经身份验证-允许访问

相关内容

最新更新