Firestore安全规则value方法失效,为何不用resource.data或get方法?
Firestore Security Rules: Why Does the Official Document Use
value() Instead of resource.data? 嘿,这个问题我之前也碰到过,其实核心原因是Firestore安全规则的语法一直在迭代,官方文档的部分示例没跟上更新节奏而已。
1. value() 是旧版语法,resource.data才是当前推荐的简洁写法
value()是早期Firestore安全规则里的用法,需要指定完整的文档路径来获取数据,写法繁琐。而resource是当前规则里的内置对象,直接代表正在被访问的目标文档,resource.data就能直接拿到文档的全部数据,不仅写法简洁,还符合现在的最佳实践,这也是你的代码能正常跑起来的原因。
2. 官方文档的旧写法属于历史遗留
很多早期的解决方案类文档(比如你提到的角色权限示例)还保留着旧版语法,但在Firestore最新的安全规则文档里,已经大量使用resource相关的写法了。不用纠结文档的旧示例,resource.data才是现在应该优先用的方式。
3. 关于get()和value()的区别
如果需要获取当前目标文档之外的其他文档的数据,现在标准的写法是用get()方法,它返回一个文档快照对象,需要通过.data来访问内容,比如:
function getRole() { return get(/databases/$(database)/documents/stories/$(story)).data.roles[request.auth.uid]; }
旧的value()其实和get().data功能等价,但get()是当前的标准API,语义更明确,还能支持检查文档是否存在这类扩展操作,比value()更实用。
总结一下:
- 处理当前被访问的文档?直接用
resource.data,简洁又高效。 - 需要拉取其他文档的数据?用
get()方法,这是现在的规范写法。 - 官方文档的旧写法不用太在意,跟着最新的规则文档走就对了。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

