Firebase多公司隔离数据表的读写规则配置方案咨询
嘿,这个多租户数据隔离的需求我太熟了,刚好可以给你一套清晰的Firebase安全规则配置方案,分两种实现思路,你可以根据自己的场景选。
核心实现思路
核心逻辑就是:先确认当前登录用户所属的COMPANY_ID,然后验证用户要访问的数据路径里的COMPANY_ID是否和自己的一致,以此实现数据隔离。
基础版规则配置(基于Users表查询)
这种方案直接从你现有的Users表中获取用户的公司ID,不需要额外的后端操作,适合快速落地:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 定义通用函数,获取当前用户的公司ID function getUserCompanyId() { // 通过用户认证ID,从Users表读取对应的COMPANY_ID return get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.COMPANY_ID; } // Users表规则:用户只能读写自己的记录,防止篡改公司关联信息 match /Users/{authId} { allow read, write: if request.auth != null && authId == request.auth.uid; } // Items表规则:仅允许访问自己公司的数据 match /Items{companyId}/{itemId} { allow read, write: if request.auth != null && companyId == getUserCompanyId(); } // 其他业务表直接套用这个模板就行,比如Orders表 match /Orders{companyId}/{orderId} { allow read, write: if request.auth != null && companyId == getUserCompanyId(); } } }
规则解释
rules_version = '2':必须指定v2版本,因为我们用到了get()函数来跨文档查询数据。getUserCompanyId():封装了从Users表获取公司ID的逻辑,避免重复代码。- Users表规则:确保用户只能操作自己的用户记录,防止他人恶意修改或查看用户的公司关联信息。
- 业务表规则:通过路径占位符
{companyId}捕获数据路径里的公司ID,再和用户自己的公司ID对比,一致才允许访问。
优化版规则配置(基于自定义Claims)
如果你的用户公司ID不会频繁变动,推荐用这个方案——把COMPANY_ID存在用户的自定义Claims里,验证时不需要查询数据库,性能更好:
第一步:设置自定义Claims(后端用Firebase Admin SDK)
在用户注册或绑定公司时,用Admin SDK给用户设置Claims:
// Node.js示例 const admin = require('firebase-admin'); admin.initializeApp(); // 假设uid是用户的认证ID,companyId是用户所属的公司ID admin.auth().setCustomUserClaims(uid, { companyId: "COMPANY_123" }) .then(() => { console.log("用户Claims设置成功"); });
第二步:编写安全规则
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // Users表规则不变 match /Users/{authId} { allow read, write: if request.auth != null && authId == request.auth.uid; } // Items表规则:直接从用户Claims获取公司ID对比 match /Items{companyId}/{itemId} { allow read, write: if request.auth != null && companyId == request.auth.token.companyId; } // 其他业务表同样套用模板 match /Orders{companyId}/{orderId} { allow read, write: if request.auth != null && companyId == request.auth.token.companyId; } } }
优化点说明
- 性能提升:验证时不需要查询Users表,直接从用户的认证令牌里取公司ID,响应更快。
- 注意事项:自定义Claims更新后,用户需要重新登录才能生效,所以适合公司ID不经常变更的场景。
关键注意事项
- 确保Users表中每个用户记录都有
COMPANY_ID字段,否则基础版规则会报错。可以在Users表的write规则里加验证:request.resource.data.COMPANY_ID != null,强制写入该字段。 - 测试规则时,一定要用Firebase控制台的“规则模拟器”验证不同场景(比如用户访问自己公司的数据、访问其他公司的数据),确保规则生效。
内容的提问来源于stack exchange,提问作者droidbee
相关产品推荐
相关产品推荐

