如何编写Firestore安全规则实现用户专属table_values数据访问
Firestore安全规则实现方案
针对你的数据结构,直接通过比对文档字段与当前用户Auth ID即可实现权限控制,无需调整现有集合结构。
完整规则代码
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 控制table_values集合的读写权限 match /table_values/{docId} { // 读取权限:仅登录用户且文档user_id与自身Auth ID匹配 allow read: if request.auth != null && resource.data.user_id == request.auth.uid; // 写入权限:仅登录用户,且操作的文档user_id与自身Auth ID匹配(防止篡改user_id) allow write: if request.auth != null && request.resource.data.user_id == request.auth.uid && // 可选:更新时不允许修改user_id (resource == null || resource.data.user_id == request.auth.uid); } // 可选:users集合的权限控制(确保用户仅能访问自己的用户文档) match /users/{docId} { allow read, write: if request.auth != null && resource.data.user_id == request.auth.uid; } } }
关键逻辑说明
- 登录验证:
request.auth != null确保只有已通过Firebase Auth登录的用户能进行操作 - 字段匹配:
resource.data.user_id == request.auth.uid直接比对table_values文档中的user_id字段与当前用户的Auth ID,无需关联查询users集合(因为两者的user_id字段是关联一致的) - 写入防护:写入时使用
request.resource.data.user_id确保用户创建新文档时只能设置自己的user_id,同时添加更新时的校验,防止用户篡改现有文档的user_id字段
注意事项
- 务必保证
table_values和users集合中的user_id字段存储的是Firebase Auth返回的用户UID(即Google登录后的用户唯一标识) - 如果需要验证用户是否存在于
users集合中,由于Firestore安全规则不支持跨集合的条件查询(除非已知文档路径),你需要额外维护一个以Auth UID为文档ID的映射集合,否则无法在规则中直接验证用户存在性
内容的提问来源于stack exchange,提问作者Shaheryar Ajmal
相关产品推荐
相关产品推荐

