Firestore安全规则中如何匹配其余集合?
Firestore安全规则配置方案:批量匹配非特殊集合
直接给你可行的配置思路,核心是利用Firestore规则的顺序匹配优先级,把特殊集合的规则放在前面,再写通用规则覆盖剩余集合,不用逐个配置:
规则代码示例
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 先定义特殊集合的规则(替换成你的特殊集合名称,比如"admin_settings") match /special_collection/{doc} { // 读取权限和其他集合一致:仅需用户认证 allow read: if request.auth != null; // 写入权限:认证 + 满足Owner身份(这里假设文档的owner字段存储用户UID,可根据实际逻辑调整) allow write: if request.auth != null && request.auth.uid == resource.data.owner; } // 匹配所有其他集合,排除特殊集合 match /{any_collection}/{doc} { allow read, write: if request.auth != null && any_collection != "special_collection"; } } }
关键逻辑说明
- 规则是从上到下匹配的,特殊集合的规则会先触发,不会被后面的通用规则覆盖
- 通用规则里通过
any_collection != "special_collection"排除特殊集合,自动匹配剩下的50多个集合 - 如果你的Owner身份判断逻辑不是基于文档字段(比如用自定义Claims),直接把写入条件改成对应的逻辑就行,比如
request.auth.token.is_owner == true
可选优化:抽离公共函数
如果规则里重复用到认证、Owner判断逻辑,可以抽成函数让代码更简洁:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 抽离认证判断函数 function isAuthenticated() { return request.auth != null; } // 抽离Owner判断函数 function isOwner(doc) { return request.auth.uid == doc.data.owner; } match /special_collection/{doc} { allow read: if isAuthenticated(); allow write: if isAuthenticated() && isOwner(resource); } match /{any_collection}/{doc} { allow read, write: if isAuthenticated() && any_collection != "special_collection"; } } }
内容的提问来源于stack exchange,提问作者Mark Nugromentry
相关产品推荐
相关产品推荐

