Firebase如何校验路径包含用户值并授权其他路径读写权限
实现方案说明
完全可以实现你需要的权限控制逻辑,Firebase 安全规则原生支持跨路径校验的能力,你的设计思路是可行的。
第一步:调整数据库结构
在每个聊天室根节点(如你提到的room_1)下新增members子节点,用「用户UID为键、布尔值true为值」的结构存储所有加入该房间的用户ID,示例结构如下:
{ "chat": { "product_id": { "product_id_12345": { "chat_room_id": { "room_1": { "members": { "xxx_uid_1": true, "xxx_uid_2": true }, "message_1": { ... }, "message_2": { ... } } } } } } }
不要用数组存储成员UID,数组结构在安全规则中做存在性校验的效率远低于键值对结构。
第二步:配置安全规则(以 Realtime Database 为例)
直接匹配聊天室下的所有路径,校验当前登录用户的UID存在于对应房间的members节点中即可,规则示例:
{ "rules": { "chat": { "product_id": { "$productId": { "chat_room_id": { "$roomId": { // 所有读写请求都校验用户是否在房间成员列表中 ".read": "auth != null && root.child('chat/product_id/' + $productId + '/chat_room_id/' + $roomId + '/members/' + auth.uid).exists()", ".write": "auth != null && root.child('chat/product_id/' + $productId + '/chat_room_id/' + $roomId + '/members/' + auth.uid).exists()" } } } } } } }
如果使用的是Cloud Firestore,逻辑完全一致,只需将规则的路径校验写法替换为Firestore对应的exists()调用即可。
校验验证
规则配置完成后,可以直接用Firebase控制台自带的规则测试工具,模拟不同UID的用户访问聊天室路径,验证权限逻辑是否符合预期。
内容的提问来源于stack exchange,提问作者user16754196
相关产品推荐
相关产品推荐

