如何限制Firestore中仅products集合的写入权限?现有规则无效
Firestore规则禁止products集合写入失效的解决办法
你的规则失效的核心原因是Firestore规则的累加性匹配逻辑:只要有一条匹配当前操作的规则允许执行,整个操作就会被放行。你写的match /{document=**}是递归匹配所有文档路径,包括products/{id},所以当用户已认证时,这条规则的allow write: if request.auth.uid != null会生效,直接绕过了products集合的禁止写入规则。
正确的规则写法
可以通过两种方式修复:
方式一:在通配规则中排除products集合
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 允许已认证用户操作除products外的所有集合 match /{collection}/{document=**} { allow read: if true; allow write: if request.auth.uid != null && collection != "products"; } // 单独禁止products集合的写入操作 match /products/{id} { allow read: if true; allow write: if false; } } }
方式二:调整匹配顺序并限制通配范围
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 先明确禁止products的写入 match /products/{id} { allow read: if true; allow write: if false; } // 仅匹配非products的顶级集合及其子文档 match /{collection}/{document=**} { allow read: if true; allow write: if request.auth.uid != null; } } }
验证方法
使用Firestore控制台的规则模拟器,分别测试:
- 对
products集合的写入操作:应该返回"权限被拒绝" - 对其他集合(比如
users)的写入操作:已认证用户可以正常执行
内容的提问来源于stack exchange,提问作者Кутман Эшенкулов
相关产品推荐
相关产品推荐

