什么是在公司的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);