Firebase Firestore的安全规则是控制数据库访问权限的核心机制,通过自定义规则可以精准限制不同用户的读写操作范围,实现读写分离和角色权限管理,避免数据被非法访问或篡改。

Firestore安全规则基础语法
Firestore安全规则的核心逻辑是通过match匹配数据库路径,再通过allow声明允许的操作及条件。基础规则结构如下:
service cloud.firestore {
match /databases/{database}/documents {
// 匹配所有集合的规则
match /{document=**} {
allow read, write: if false; // 默认拒绝所有操作
}
}
}
其中allow后面可以跟的操作包括read(包含get、list)、write(包含create、update、delete),也可以单独声明细分操作。
实现读写分离配置
读写分离的核心是区分读操作和写操作的允许条件,通常读操作的权限范围会比写操作更宽泛。以下是一个简单的读写分离示例,允许所有登录用户读取公开文章,仅允许文章作者修改和删除自己的文章:
service cloud.firestore {
match /databases/{database}/documents {
// 匹配文章集合
match /articles/{articleId} {
// 读操作:所有已登录用户都可以读取
allow read: if request.auth != null;
// 写操作:仅文章作者可以创建、更新、删除
allow write: if request.auth != null && request.auth.uid == resource.data.authorId;
}
}
}
如果需要进一步细分写操作,也可以单独声明allow create、allow update、allow delete,给不同操作设置不同的条件。
角色权限管理实现
角色权限管理通常需要先在用户文档中存储角色信息,再在规则中读取角色进行判断。假设我们在users集合中存储每个用户的role字段,可选值为admin、editor、normal。
第一步:存储用户角色信息
用户注册成功后,在users集合中创建对应用户文档:
// 前端注册成功后写入用户角色,默认普通用户
const user = firebase.auth().currentUser;
firebase.firestore().collection('users').doc(user.uid).set({
uid: user.uid,
role: 'normal', // 角色字段
nickname: '测试用户'
});
第二步:配置角色相关安全规则
规则中通过get方法获取用户角色信息,再判断对应权限:
service cloud.firestore {
match /databases/{database}/documents {
// 用户集合规则,仅允许用户自己读取自己的信息,管理员可以读取所有用户信息
match /users/{userId} {
allow read: if request.auth != null && (request.auth.uid == userId || get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin');
allow write: if request.auth != null && request.auth.uid == userId; // 用户仅能修改自己的信息
}
// 文章集合角色权限规则
match /articles/{articleId} {
// 所有登录用户可读取
allow read: if request.auth != null;
// 创建:编辑者和管理员可以创建文章
allow create: if request.auth != null && (get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'editor' || get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin');
// 更新:作者、编辑者、管理员可以更新
allow update: if request.auth != null && (request.auth.uid == resource.data.authorId || get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role in ['editor', 'admin']);
// 删除:仅管理员可以删除
allow delete: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin';
}
}
}
规则测试与调试
Firebase控制台提供了安全规则模拟器,可以在部署规则前测试不同用户、不同操作是否符合预期。测试时需要注意:
- 模拟用户需要对应真实的用户UID,或者手动输入测试用的UID
- 测试写操作时需要填写对应的文档数据,确保条件判断的字段存在
- 规则修改后需要点击发布才会生效,模拟器测试不会自动发布
如果规则出现错误,控制台会返回具体的错误原因,比如条件判断失败、路径匹配错误等,根据提示调整规则即可。
常见注意事项
安全规则是客户端访问数据库的唯一权限控制,不要依赖前端代码做权限校验,前端校验可以被绕过。
另外需要注意规则中的resource和request.resource的区别:resource是数据库中已存在的文档数据,request.resource是本次请求要写入的文档数据,校验写入数据时如果需要同时判断原有数据和新数据,要区分使用这两个对象。
最后,规则部署后建议定期检查,当业务角色或权限需求变化时,及时更新规则,避免出现权限漏洞。
Firebase_Firestore安全规则读写分离角色权限管理修改时间:2026-07-08 03:36:26