Firestore规则请求不存在文档触发权限拒绝?原因及解决咨询
Firestore 权限规则问题解答
问题原因
没错,这个错误就是因为请求不存在的文档时,规则里的resource对象为null,此时调用resource.data、fieldExists(resource, ...)这类操作会直接触发权限拒绝——Firestore规则在处理不存在的资源时,访问其属性会被视为无效操作,导致整个条件判断失败,返回权限不足。
解决方案
要实现「验证存在的文档数据,同时允许请求不存在的文档返回空结果」,你需要在规则里先判断文档是否存在,再分情况处理:
修改后的规则示例:
match /users/{userId} { // Returns true if auth's email is empty and user's // insensitiveEmail is empty or non-existent function emailDoesNotExist(resource) { return request.auth.token.email.size() == 0 && (!fieldExists(resource, "insensitiveEmail") || resource.data.insensitiveEmail.size() == 0); } // Returns true if auth's email matches user's email function emailMatches(resource) { return request.auth.token.email == resource.data.insensitiveEmail; } // Returns true if the auth uid matches the resource's uid function uidMatchesResource(resource) { return request.auth.uid == resource.data.uid && request.auth.uid == resource.id; } allow get: if request.auth != null && request.auth.uid == userId && ( // 文档不存在时直接允许,返回空结果 !exists(/databases/$(database)/documents/users/$(userId)) // 文档存在时执行原有的验证逻辑 || (uidMatchesResource(resource) && (emailDoesNotExist(resource) || emailMatches(resource))) ); }
核心逻辑是用短路或(||):先检查文档是否不存在,如果是,直接通过规则;如果文档存在,再执行你原来的属性验证逻辑。这样既保证了存在的文档只能被合法用户访问,又允许请求不存在的ID时返回空,不会触发权限错误。
内容的提问来源于stack exchange,提问作者Reagankm
相关产品推荐
相关产品推荐

