如何在Firestore安全规则中检查Reference的相等性?
Firestore安全规则中检查引用相等性的正确方法
在Firestore安全规则里可以检查引用的相等性,你之前的问题出在试图用字符串路径和引用类型直接比较——这两种是完全不同的数据类型,哪怕路径内容一致,结果也永远是false。下面是正确的实现方式:
核心思路
不要用硬编码的路径字符串,而是用Firestore规则内置的API构建和members数组中类型一致的引用对象,再进行比较或数组包含检查。
具体实现示例
假设你需要验证当前用户是否是某个letterbox文档的成员,规则可以这么写:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /letterbox/{letterboxId} { // 检查当前用户的引用是否存在于members数组中 allow read, write: if resource.data.members.hasAny([ database.collection('users').doc(request.auth.uid) ]); } } }
关键细节说明
- 引用类型匹配:
database.collection('users').doc(request.auth.uid)生成的是规则中的引用类型,和你存储在members数组里的Firestore引用类型完全一致,这样用hasAny()就能正确匹配。 - 单个引用相等性检查:如果需要验证数组中某个特定位置的引用,直接用引用类型比较即可,比如:
allow read: if resource.data.members[0] == database.collection('users').doc(request.auth.uid); - 测试平台注意事项:在规则测试平台中,记得开启「Authenticated」模拟,填入对应的用户UID,同时确保测试用的
letterbox文档的members数组中确实包含该UID对应的用户文档引用。
内容的提问来源于stack exchange,提问作者Connor White
相关产品推荐
相关产品推荐

