Firebase Firestore权限拒绝错误:写入subscribers集合失败求助
问题原因分析
从错误日志和安全规则来看,权限拒绝发生在写入subscribers/{subscriberId}文档时,核心原因有两点:
- 创建文档时
resource.data不存在:当前规则中write操作依赖resource.data.userId、resource.data.phone等字段,但resource指的是已存在的文档,执行创建新文档操作时,resource.data为null,导致所有条件不满足,触发权限拒绝。 - 规则范围不明确:顶级
match下的直接allow规则会应用到所有集合的文档,包括subscribers,但没有针对subscribers集合做针对性权限配置,逻辑混乱。
解决办法
修改Firestore安全规则,明确subscribers集合的权限逻辑,拆分创建(create)和更新(update)操作的校验条件:
service cloud.firestore { match /databases/{database}/documents { // 管理员读取规则(保留原逻辑) match /subscribers/{subscriberId} { allow read: if isSignIn() && request.auth.uid == resource.data.userId && resource.data.role == "Admin"; // 订阅者的创建规则 allow create: if isSignIn() && request.resource.data.userId == request.auth.uid && request.auth.token.phone_number == request.resource.data.phone && request.resource.data.role == "Subscriber"; // 订阅者的更新/删除规则 allow update, delete: if isSignIn() && request.auth.uid == resource.data.userId && request.auth.token.phone_number == resource.data.phone && resource.data.role == "Subscriber"; } // sites集合规则(保留原逻辑) match /sites/{site} { allow read, write: if isSignIn(); match /messages/{message} { allow read, write: if isSignIn(); } } } function isSignIn(){ return request.auth.uid != null; } }
关键修改点说明
- 明确集合匹配范围:给
subscribers集合单独设置match /subscribers/{subscriberId},避免规则影响其他集合。 - 拆分write操作:将原有的
write拆分为create和update/delete:- 创建(
create)时,使用request.resource.data校验要写入的字段,确保新文档的userId、phone、role与当前用户身份匹配。 - 更新/删除(
update, delete)时,使用resource.data校验已存在文档的字段,保证操作人是文档所属用户。
- 创建(
- 保留原管理员和sites集合逻辑:确保原有功能不受影响。
额外检查项
- 确认用户短信验证后,
request.auth.token.phone_number已正确关联到用户令牌(Firebase Auth会自动完成该关联)。 - 确认写入
subscribers文档时,传入的userId、phone、role字段值符合规则要求,比如userId必须等于当前用户的uid,phone需带国家区号(如+8613xxxxxxxxx)且与Auth令牌中的格式一致。
内容的提问来源于stack exchange,提问作者user14828291
相关产品推荐
相关产品推荐

