如何阻止Firestore调用addDocument时自动创建根集合?
问题1:阻止自动创建未预先存在的集合
要实现只允许向已存在的集合写入文档(避免自动生成新集合),可以修改安全规则,通过检查目标集合下是否有已存在的文档来间接确认集合存在(Firestore里只有包含文档的集合才被视为“存在”)。结合你原有的登录验证规则,调整后的规则如下:
rules_version = '12'; service cloud.firestore { match /databases/{database}/documents { // 仅允许登录用户操作目标集合下的文档 match /{collection}/{document} { allow read, write: if request.auth.uid != null && // 验证集合已存在(检查集合下是否有任意文档) exists(/databases/$(database)/documents/$(collection)/{anyDocument}); } } }
- 这里用
exists(...)判断集合下有没有至少一个文档,以此确保集合是提前创建好的。 - 当用户尝试向不存在的集合(比如
form2)添加文档时,这个条件不满足,addDocument()会返回权限不足的错误,也就阻止了新集合被自动创建。
问题2:原规则失效的原因
你提供的规则无法生效,核心是两个问题:
路径匹配逻辑混淆
match /{collection}对应的是集合级操作(比如列出所有集合、获取集合元数据),而addDocument()属于文档级操作,匹配的是match /{collection}/{document}路径。不过这不是主要问题,关键在于第二个错误。
集合存在性判断错误
exists(/databases/$(database)/documents/$(collection))写法错误:exists()函数只能用来检查文档是否存在,不能直接判断集合是否存在。你写的这个路径是在根目录下查找名为$(collection)的文档,而非检查目标集合本身。- 正确的做法是检查集合下是否有任意文档,也就是用
exists(/databases/$(database)/documents/$(collection)/{anyDocument}),就像问题1中的规则那样。
另外,你的规则没有包含登录验证逻辑,即使集合存在,未登录用户也会被拒绝;但你描述的“集合存在仍提示权限不足”,主要原因还是exists的判断逻辑错误,导致允许条件不成立。
内容的提问来源于stack exchange,提问作者Joe Huang
相关产品推荐
相关产品推荐

