如何将Realtime Database安全规则从测试模式切换至锁定模式?
Firebase Realtime Database 按用户配置安全规则的实现步骤
前提准备
确保你的项目已经启用Firebase Authentication,安全规则依赖用户的认证UID完成权限校验。
1. 规划用户隔离的数据结构
先把数据按用户UID分区存储,推荐结构如下:
- users - {用户UID} - profile - settings - ...
每个用户的数据都被隔离在自身UID对应的节点下,便于规则精准校验。
2. 编写基础用户权限规则
在Firebase控制台的Realtime Database规则页面,替换测试规则为以下内容:
{ "rules": { "users": { "$uid": { // 仅当前登录用户可读取自己的数据 ".read": "auth.uid === $uid", // 仅当前登录用户可写入自己的数据 ".write": "auth.uid === $uid" } }, // 公共数据节点可单独配置权限 "public": { ".read": true, ".write": false } } }
$uid是规则中的通配符,匹配路径里的用户UIDauth.uid代表当前已登录用户的UID,仅当两者完全匹配时,才允许对应的读写操作
3. 前端适配数据读写逻辑
在应用代码中,读写数据时需用当前用户的UID作为节点键,以JS为例:
// 获取当前登录用户 const user = firebase.auth().currentUser; if (user) { // 写入用户个人数据 firebase.database().ref(`users/${user.uid}/profile`).set({ name: "张三", email: user.email }); // 读取用户个人数据 firebase.database().ref(`users/${user.uid}/profile`).on('value', (snapshot) => { const data = snapshot.val(); // 处理数据逻辑 }); }
4. 验证规则有效性
使用Firebase控制台的规则模拟器做测试:
- 模拟已登录用户:输入存在的UID,校验读写自身节点是否成功
- 模拟未登录用户:校验读写任意用户节点是否被拒绝
- 模拟其他用户:校验读写他人节点是否被拒绝
进阶规则示例
如果需要支持部分公开数据或管理员权限,可调整规则如下:
{ "rules": { "users": { "$uid": { // 允许用户读取自身数据,或读取标记为公开的用户数据 ".read": "auth.uid === $uid || root.child('users').child($uid).child('isPublic').val() === true", // 允许用户修改自身数据,或管理员修改任意数据 ".write": "auth.uid === $uid || auth.token.admin === true" } } } }
- 给用户设置管理员权限,需在自定义认证令牌中添加
admin: true字段
内容的提问来源于stack exchange,提问作者Abdullah Al Fahad
相关产品推荐
相关产品推荐

