如何在Firebase Security Rules中获取Firestore文档名并验证权限
Firestore安全规则中获取文档ID并验证用户身份的正确方式
当然可以在Firestore安全规则中获取文档名称(即文档ID),用来验证用户ID与文档ID是否一致。你遇到的Null value error,大概率是因为在不适用resource.id的场景中使用了它,比如集合查询操作。
问题原因
resource对象代表的是已经存在的目标文档数据,只有在针对单个文档的读取/写入操作中才会有效。如果是集合级别的操作(比如查询整个用户集合),Firestore在评估规则时无法提前获取每个文档的resource,此时resource会是null,直接访问resource.id就会触发空值错误。
正确解决方案
更可靠的方式是直接通过路径通配符获取文档ID,这种方式在单个文档操作和集合查询场景下都能正常工作。假设你的数据库结构是users/{userId}(每个用户文档的ID等于用户的UID),规则可以这么写:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 验证单个用户文档的读取权限:文档ID等于当前用户UID match /users/{userId} { allow read: if request.auth != null && userId == request.auth.uid; // 如果需要限制写入(比如只能创建自己的文档) allow write: if request.auth != null && userId == request.auth.uid; } // 若需允许集合查询,但仅返回当前用户的文档 match /users/{userId} { allow list: if request.auth != null && userId == request.auth.uid; // 或者强制查询条件必须包含文档ID等于用户UID(更严格) // allow list: if request.auth != null && request.query.where('__name__', '==', request.auth.uid); } } }
关于resource.id的正确使用场景
如果是针对单个文档的写入操作(比如更新自己的文档),可以用resource.id来验证现有文档的ID是否与用户UID一致:
match /users/{userId} { allow update: if request.auth != null && resource.id == request.auth.uid; }
这种场景下resource是存在的,不会触发空值错误。
测试环境注意事项
在规则测试工具中,测试单个文档读取时,要确保指定具体的文档路径(比如users/test-user-uid),并设置测试用户的UID与文档ID一致;如果测试集合查询,要使用基于通配符的规则,避免用resource.id。
内容的提问来源于stack exchange,提问作者Equalisys
相关产品推荐
相关产品推荐

