You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不经常变更的场景。
关键注意事项
  1. 确保Users表中每个用户记录都有COMPANY_ID字段,否则基础版规则会报错。可以在Users表的write规则里加验证:request.resource.data.COMPANY_ID != null,强制写入该字段。
  2. 测试规则时,一定要用Firebase控制台的“规则模拟器”验证不同场景(比如用户访问自己公司的数据、访问其他公司的数据),确保规则生效。

内容的提问来源于stack exchange,提问作者droidbee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:55:14