为自定义认证的Firebase实时数据库配置安全规则求助
Firebase实时数据库安全规则适配方案
先修正规则语法错误
你提供的根节点规则存在JSON语法错误(.write行末尾多余逗号),这会导致规则无法正常加载,是引发权限问题的直接原因之一。修正后的基础规则如下:
{ "rules": { ".read": "auth.uid !== null", ".write": "auth.uid !== null" } }
修正后,访问Chat子节点的权限应该会恢复。但为了保证数据安全,需要针对你的数据库结构配置精细化规则,避免全量读写的风险。
适配业务结构的精细化安全规则
结合你的聊天应用数据结构,以下规则既保证已登录用户的合法操作,又严格限制非法访问,同时兼容现有上线用户:
{ "rules": { // 全局默认:未登录用户禁止所有操作 ".read": false, ".write": false, "Chat": { // 用户仅能访问自己参与的聊天会话 "$chatId": { ".read": "auth.uid !== null && ($chatId.split('-')[0] === auth.uid || $chatId.split('-')[1] === auth.uid)", ".write": "auth.uid !== null && ($chatId.split('-')[0] === auth.uid || $chatId.split('-')[1] === auth.uid)", // 写入消息时,校验发送者ID与当前登录用户UID一致 "$messageId": { ".write": "auth.uid === newData.child('Message_From_ID').val()" } }, // 兼容现有业务可能的批量读取需求(可选,根据实际情况调整) ".read": "auth.uid !== null" }, "Users": { // 用户仅能读写自己的信息 "$userId": { ".read": "auth.uid === $userId", ".write": "auth.uid === $userId" }, // 兼容批量读取用户列表的场景(可选) ".read": "auth.uid !== null" }, "UsersLocations": { // 用户仅能访问自己的位置数据 "$userId": { ".read": "auth.uid === $userId", ".write": "auth.uid === $userId" } } } }
规则详解
- 语法修正:移除规则中多余的逗号,确保JSON格式合法,规则能正常加载。
- Chat节点:
- 会话层级:通过拆分
$chatId的连字符,判断当前用户UID是会话的参与方之一,仅允许读写该会话。 - 消息层级:写入消息时强制校验
Message_From_ID等于当前登录用户的UID,防止伪造消息。 - 保留了
Chat节点的全局读权限(可选),兼容现有应用可能的批量加载聊天列表的逻辑。
- 会话层级:通过拆分
- Users节点:细化到用户ID层级,确保用户只能修改自己的在线状态、最后登录时间等信息;同时保留全局读权限,兼容可能的用户列表展示需求。
- UsersLocations节点:严格限制用户仅能访问自己的位置数据,避免隐私泄露。
上线过渡建议
由于应用已上线,建议分两步切换规则:
- 先修正基础规则的语法错误,确保现有用户正常使用。
- 在Firebase控制台的规则模拟器中测试精细化规则,模拟不同用户UID的读写操作,验证无误后再逐步替换为精细化规则。如果担心影响现有用户,可以先采用过渡规则:
{ "rules": { // 临时保留全局宽松规则,兼容现有操作 ".read": "auth.uid !== null", ".write": "auth.uid !== null", "Chat": { "$chatId": { ".read": "auth.uid !== null && ($chatId.split('-')[0] === auth.uid || $chatId.split('-')[1] === auth.uid)", ".write": "auth.uid !== null && ($chatId.split('-')[0] === auth.uid || $chatId.split('-')[1] === auth.uid)", "$messageId": { ".write": "auth.uid === newData.child('Message_From_ID').val()" } } }, "Users": { "$userId": { ".read": "auth.uid === $userId", ".write": "auth.uid === $userId" } }, "UsersLocations": { "$userId": { ".read": "auth.uid === $userId", ".write": "auth.uid === $userId" } } } }
过渡规则既保证现有用户不受影响,又逐步加强了核心节点的安全限制,待稳定运行后再移除全局宽松规则。
内容的提问来源于stack exchange,提问作者Ritu
相关产品推荐
相关产品推荐

