Firebase Firestore安全规则配置:非登录列表贡献者访问权限校验实现
方案可行性说明
你的需求可以实现,不需要受邀者登录即可完成列表操作,核心逻辑通过校验list_contributor文档的存在性即可完成,需要先修正现有规则的冲突问题,再补充对应校验逻辑即可。
现有规则的问题修正
你当前配置的全局通配规则match /{document=**}要求所有操作必须登录,会优先覆盖子路径的开放权限,需要先调整:要么删除该全局规则,要么保留的前提下在/lists路径下明确豁免登录要求(Firestore安全规则中更具体的路径匹配优先级更高,子路径配置会覆盖全局通配规则)。
另外原规则中match /lists仅匹配集合本身,无法匹配集合下的单个列表文档,需要改为带通配符的match /lists/{listId}才能生效。
补充后的完整规则
service cloud.firestore { match /databases/{database}/documents { // 可选:如果不需要全局登录校验可以直接删除该条规则 match /{document=**} { allow read, write: if isSignedIn(); } match /users/{userId} { allow create; allow update, delete, write: if isOwner(userId); } // 通配符{listId}匹配单个列表文档 match /lists/{listId} { // 所有人(含未登录)可创建列表 allow create: if true; // 仅所有者可删除列表 allow delete: if isOwner(resource.data.ownerId); // 写入/更新校验:操作者是所有者 或 存在匹配的贡献者文档 allow update, write: if isOwner(resource.data.ownerId) || isContributor(listId); } // 开放list_contributor集合的创建权限,用于受邀者填写昵称后生成文档 match /list_contributors/{contributorId} { allow create: if true; } } //functions function isOwner(id){ return request.auth != null && request.auth.uid == id; } function isSignedIn(){ return request.auth != null; } // 新增贡献者校验函数 function isContributor(listId) { // 校验请求中携带的contributor_uid,存在对应list_id匹配的贡献者文档 // 请根据实际情况替换集合路径、字段名 let contributorDoc = get(/databases/$(database)/documents/list_contributors/$(request.resource.data.contributor_uid)); return contributorDoc.exists && contributorDoc.data.list_id == listId; } }
注意事项
- 请将规则中
list_contributors的集合路径、字段名替换为你实际使用的命名 - 贡献者UID请使用随机度足够高的字符串(比如UUID),避免被暴力猜解导致列表被非法操作
- 如果你需要限制贡献者只能修改自己提交的内容,可以在校验逻辑中进一步增加字段级别的权限限制
内容的提问来源于stack exchange,提问作者yourivdloo
相关产品推荐
相关产品推荐

