如何在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字段,判断当前用户是否为管理员
额外注意事项
- 确保
users集合中的文档ID和用户的auth.uid完全一致——从你现有的users规则(用户只能更新自己ID对应的文档)来看,这个前提已经满足 - 规则中的路径占位符
$(database)要和外层的{database}变量对应,不能写错 - 如果你的
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
相关产品推荐
相关产品推荐

