Firestore集合组安全规则中是否允许使用exists()函数?
Firestore集合组安全规则中能否使用
exists()函数? Firestore集合组安全规则支持使用exists()函数,你遇到的错误并非因为函数不可用,而是传入exists()的路径参数无效导致的。
错误原因分析
你收到的错误提示Function: [exists], Argument: ["||invalid_argument||"],说明构建的文档路径存在问题,大概率是以下情况之一:
request.auth.uid为空(未在模拟器中配置认证信息,或用户未登录)resource.data.projectId为空或不存在(目标option文档没有projectId字段,或在集合组查询场景下resource对象不可用)
注意:集合组规则中,resource仅在单个文档读取(get操作)时代表目标文档;如果是集合组查询(list操作),resource对象不存在,此时无法通过resource.data获取字段值,这是常见的误区。
修正后的规则代码
针对不同的读取操作(get/list),需要分别处理:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // permissions(集合组规则) match /{path=**}/member/{permission} { allow read: if request.auth.uid == resource.data.userId; } // options(集合组规则) match /{path=**}/option/{option} { // 单个文档读取:验证用户已认证、projectId存在,且对应member文档存在 allow get: if request.auth != null && resource.data.projectId != null && exists(/databases/$(database)/documents/project/$(resource.data.projectId)/member/$(request.auth.uid)); // 集合组查询:要求查询条件包含projectId,且该project下的member文档存在 allow list: if request.auth != null && request.query.where('projectId', '==', request.query.get('projectId')) && exists(/databases/$(database)/documents/project/$(request.query.get('projectId'))/member/$(request.auth.uid)); } } }
模拟器测试注意事项
- 测试get操作时:需选择具体的
option文档,确保该文档存在projectId字段,同时在模拟器中配置有效的request.auth.uid - 测试list操作时:必须添加查询条件(如
where projectId == "你的项目ID"),否则规则无法获取projectId来验证exists()路径
内容的提问来源于stack exchange,提问作者jvhang
相关产品推荐
相关产品推荐

