Firestore规则新手求助:如何验证对象内用户ID是否存在?
没问题!结合你的需求、查询逻辑和数据结构,我来帮你写出精准的Firestore规则,确保只有用户ID存在于目标events文档的users对象中时,才能访问该文档。
完整规则代码
service cloud.firestore { match /databases/{database}/documents { // 辅助函数:校验用户是否已登录 function isSignedIn() { return request.auth.uid != null; } // 核心辅助函数:检查当前用户ID是否在目标文档的users对象中 function isUserAuthorized(doc) { return doc.data.users[request.auth.uid] == true; } // 匹配events集合下的所有文档 match /events/{eventId} { // 读取权限:已登录 + 用户ID在文档的users对象里 allow read: if isSignedIn() && isUserAuthorized(resource); // 写入权限(可根据你的实际需求调整,示例为占位) allow write: if isSignedIn() && /* 比如仅文档创建者可写:resource.data.creatorUid == request.auth.uid */ false; } } }
关键部分解释
isSignedIn():你已经定义的基础校验,确保请求来自已登录用户,这是所有权限校验的前提。isUserAuthorized(doc):这是针对你需求的核心逻辑——接收文档对象后,检查当前登录用户的ID是否作为users对象的键存在,且对应值为true,完全匹配你的数据结构和查询条件。allow read规则:将两个条件结合,只有同时满足已登录、且用户ID在目标文档的users对象中时,才允许读取操作(包括你用whereEqualTo("users." + user.getUid(), true)发起的查询)。Firestore会自动过滤掉不符合条件的文档,确保用户只能看到自己有权访问的内容。
额外注意事项
- 你的查询和规则逻辑完全匹配,不需要修改现有查询代码,规则会自动适配过滤。
- 如果你需要支持创建、更新、删除
events文档的权限,可以修改allow write部分的条件,比如限制只有文档的创建者或管理员才能操作。 - 可以用Firebase控制台的规则模拟器来测试:模拟已登录用户,分别尝试读取存在于
users对象中的文档和不存在的文档,确认规则是否生效。
内容的提问来源于stack exchange,提问作者EagerToSing
相关产品推荐
相关产品推荐

