如何在Realtime Database Rules中配置子文档共享权限?
Firebase Realtime Database 实验共享权限配置解决方案
核心问题
Realtime Database 安全规则原生不支持遍历数组校验元素存在性,因此基于现有sharedWith数组结构无法直接实现权限判断,需调整数据结构实现需求。
最优方案:将sharedWith数组改造为键值对映射
该方案改造成本最低、性能最优,具体实现逻辑如下:
- 改造数据结构:把原存储受邀用户ID的数组,调整为以用户ID为键、
true为固定值的映射结构,安全规则支持直接判断键是否存在,无需遍历。
改造前后数据示例:
// 原数组结构(无法适配规则校验) "sharedWith": ["abc123", "def456"] // 新映射结构(适配规则校验) "sharedWith": { "abc123": true, "def456": true }
配套安全规则配置
针对你的存储路径/users/{$user_id}/${experiment_id}/,可直接使用如下规则:
{ "rules": { "users": { "$ownerUid": { "$experimentId": { // 仅实验所有者、受邀用户可读写 ".read": "auth != null && (auth.uid == $ownerUid || data.child('sharedWith').child(auth.uid).exists())", ".write": "auth != null && (auth.uid == $ownerUid || data.child('sharedWith').child(auth.uid).exists())" } } } } }
平滑迁移步骤(不影响现有业务运行)
- 先上线前端兼容逻辑:新增/修改受邀用户时,同时写入原
sharedWith数组和新sharedWith映射,避免影响现有正常运行的业务功能 - 编写云函数批量遍历所有已有实验数据,将历史
sharedWith数组转换为映射结构 - 全量数据迁移完成后,验证权限逻辑正常,即可下线原
sharedWith数组的读写逻辑
备选方案(不推荐)
如果暂时无法修改数据结构,可使用Firebase云函数封装所有实验读写接口,在云函数层做数组遍历的权限校验,但会额外增加请求耗时和云函数调用成本,不如直接改造数据结构高效。
内容的提问来源于stack exchange,提问作者Kamilski81
相关产品推荐
相关产品推荐

