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

如何在Firestore规则中跨集合引用数据限制赛事创建权限?

如何在Firestore规则中引用其他集合的数据来限制赛事创建?

当然可以在Firestore规则里引用其他集合的文档!你想通过规则增强安全性、防止非管理员创建赛事的需求完全能实现,不过你写的示例语法需要调整——Firestore规则提供了专门的get()函数来实现跨集合的数据读取。

核心实现思路

我们需要在tournaments集合的创建规则中,获取当前请求用户的users文档,检查其中的isAdmin字段是否为true。Firestore规则中的get()函数可以直接读取指定路径的文档数据,而且这个操作不会占用你的数据库读取配额,完全是规则层面的校验。

修改后的完整规则代码

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow create, read;
      allow update: if request.auth.uid == userId;
    }
    match /tournaments/{tournamentId} {
      // 仅允许已登录的管理员创建赛事
      allow create: if request.auth.uid != null && 
        get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin == true;
      // 保留你原来的读取和更新规则(已登录用户即可操作)
      allow read, update: if request.auth.uid != null;
    }
  }
}

关键部分解释

  • request.auth.uid != null:先校验用户已完成登录,这是所有操作的基础前提
  • get(/databases/$(database)/documents/users/$(request.auth.uid)):通过用户的认证ID,精准获取对应的users文档
  • .data.isAdmin == true:读取文档中的isAdmin字段,判断当前用户是否为管理员

额外注意事项

  1. 确保users集合中的文档ID和用户的auth.uid完全一致——从你现有的users规则(用户只能更新自己ID对应的文档)来看,这个前提已经满足
  2. 规则中的路径占位符$(database)要和外层的{database}变量对应,不能写错
  3. 如果你的users文档可能存在未创建的情况(比如用户刚注册还没生成对应文档),可以添加exists()校验避免规则报错:
    allow create: if request.auth.uid != null && 
      exists(/databases/$(database)/documents/users/$(request.auth.uid)) &&
      get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin == true;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:03