在Firestore规则中将访问限制为仅通过身份验证的用户的实际正确条件是什么? official docs和此处的几个答案都表明您应该使用request.auth.uid != null
。我过去曾经使用过它,并且似乎可以使用,但是最近当我在模拟器中测试其他规则时,我注意到当请求未经身份验证时,它会在这种情况下抛出Null value error
。
在这种情况下,request.auth != null
似乎是您应该使用的实际条件,因为它看起来像在模拟器中一样。
模拟器和规则的实际行为之间是否存在差异?如果模拟器正确,那么我认为request.auth.uid != null
条件仅在“有效”,因为默认条件是在条件出错时拒绝访问。另一个选择是模拟器错误,并且在实际使用数据库时request.auth
永远不会null
。
是哪个?
答案 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);