You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore规则新手求助:如何验证对象内用户ID是否存在?

没问题!结合你的需求、查询逻辑和数据结构,我来帮你写出精准的Firestore规则,确保只有用户ID存在于目标events文档的users对象中时,才能访问该文档。

完整规则代码
service cloud.firestore {
  match /databases/{database}/documents {
    // 辅助函数:校验用户是否已登录
    function isSignedIn() {
      return request.auth.uid != null;
    }

    // 核心辅助函数:检查当前用户ID是否在目标文档的users对象中
    function isUserAuthorized(doc) {
      return doc.data.users[request.auth.uid] == true;
    }

    // 匹配events集合下的所有文档
    match /events/{eventId} {
      // 读取权限:已登录 + 用户ID在文档的users对象里
      allow read: if isSignedIn() && isUserAuthorized(resource);
      
      // 写入权限(可根据你的实际需求调整,示例为占位)
      allow write: if isSignedIn() && /* 比如仅文档创建者可写:resource.data.creatorUid == request.auth.uid */ false;
    }
  }
}
关键部分解释
  • isSignedIn():你已经定义的基础校验,确保请求来自已登录用户,这是所有权限校验的前提。
  • isUserAuthorized(doc):这是针对你需求的核心逻辑——接收文档对象后,检查当前登录用户的ID是否作为users对象的键存在,且对应值为true,完全匹配你的数据结构和查询条件。
  • allow read规则:将两个条件结合,只有同时满足已登录、且用户ID在目标文档的users对象中时,才允许读取操作(包括你用whereEqualTo("users." + user.getUid(), true)发起的查询)。Firestore会自动过滤掉不符合条件的文档,确保用户只能看到自己有权访问的内容。
额外注意事项
  • 你的查询和规则逻辑完全匹配,不需要修改现有查询代码,规则会自动适配过滤。
  • 如果你需要支持创建、更新、删除events文档的权限,可以修改allow write部分的条件,比如限制只有文档的创建者或管理员才能操作。
  • 可以用Firebase控制台的规则模拟器来测试:模拟已登录用户,分别尝试读取存在于users对象中的文档和不存在的文档,确认规则是否生效。

内容的提问来源于stack exchange,提问作者EagerToSing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:28:00