Firestore安全规则无法校验子集合角色 书籍共享权限配置异常
问题排查点及修正方案
你当前规则失败的核心原因有3个:
- 缺少登录状态校验:未判断
request.auth != null,未登录状态下直接读取request.auth.token.email会直接抛出异常,导致规则校验失败 - 未校验参考文档是否存在:直接调用
get().data.role时,如果发起共享的用户自身没有对应bookId的文档,会直接抛出异常导致规则拒绝 - 邮箱大小写匹配问题:Firebase Auth返回的
token.email大小写和你userBooks下存储的邮箱doc名称可能不一致,大小写敏感会导致路径匹配失败
修正后的安全规则示例
match /userBooks/{emailId}/books/{bookId} { // 先校验登录状态,再调用权限判断函数 allow write: if request.auth != null && isSharedAdmin(bookId); } function isSharedAdmin(bookId){ // 统一转小写避免大小写匹配问题 let currentUserEmail = request.auth.token.email.lower(); let userBookPath = /databases/$(database)/documents/userBooks/$(currentUserEmail)/books/$(bookId); // 先判断文档存在,再读取角色字段 return exists(userBookPath) && get(userBookPath).data.role == "admin"; }
额外校验建议
- 确认
userWantsToShare@gmail.com对应的/userBooks/userwantstoshare@gmail.com/books/9KHYZJVBY3BNAlYPYYoA文档中,role字段的值确实为字符串admin(无大小写、拼写错误) - 若需要限制共享时写入的角色范围,可新增规则约束:
request.resource.data.role in ["read", "edit"],避免写入非法角色值
内容的提问来源于stack exchange,提问作者yaguarete
相关产品推荐
相关产品推荐

