3. 租户与客户模型:Tenant与Customer实体关系、层级结构、权限边界划分

在 ThingsBoard 的多租户架构中,Tenant(租户) 和 Customer(客户) 是核心的实体模型。理解它们之间的关系、层级结构以及权限边界,是实现数据安全隔离与资源精细化管理的基石。本章将深入剖析这两个实体的定义、关联方式以及在实际部署中的权限划分策略。

3.1 实体关系与层级结构

ThingsBoard 采用两层租户模型:顶层为 Tenant,下层为 Customer。一个 Tenant 可以拥有多个 Customer,但一个 Customer 只能属于一个 Tenant。这种一对多的关系构成了平台资源隔离的基本单元。

核心概念: Tenant 是资源的拥有者和计费主体,Customer 是资源的最终使用者和消费者。Tenant 负责创建和管理 Customer,并为每个 Customer 分配设备、仪表板、规则链等资源。

下表总结了 Tenant 与 Customer 的关键属性差异:

属性维度 Tenant(租户) Customer(客户)
层级位置 顶层实体,系统管理员之下 第二层实体,隶属于 Tenant
资源所有权 拥有设备、资产、仪表板、规则链等全部资源 被授予使用 Tenant 资源的权限,不拥有所有权
用户管理 管理本租户下的所有用户(包括 Customer 用户) 管理本客户下的用户(仅限客户级用户)
数据可见性 可见本租户下所有设备和客户的数据 仅可见被授权给自己的设备和资产数据
计费模型 作为计费主体,向平台支付费用 通常由 Tenant 向其收费,或作为 Tenant 内部的成本中心
典型场景 一个企业(如智慧园区运营商) 该企业下的一个具体项目或终端客户(如某栋楼宇)

下图展示了 Tenant 与 Customer 在 ThingsBoard 实体模型中的层级关系:

Tenant 与 Customer 层级结构图 系统管理员 Tenant(租户) Customer 层(隶属于 Tenant) Customer A Customer B Customer C 资源层(设备、资产、仪表板、规则链) 设备 资产 仪表板 说明:Customer 不直接拥有资源,而是通过 Tenant 的授权(Assignment)获得对特定资源的使用权限。

3.2 权限边界划分

权限边界是租户隔离的核心。ThingsBoard 通过实体组(Entity Group)和角色(Role)机制,在 Tenant 和 Customer 之间划定了清晰的权限边界。

3.2.1 默认权限边界

  • Tenant 管理员:拥有其租户内所有资源的完全控制权,包括创建/删除 Customer、管理所有设备、配置规则链、查看所有遥测数据。
  • Customer 用户:默认情况下,只能看到自己被授权的设备、资产和仪表板。无法查看其他 Customer 的资源,也无法访问 Tenant 级别的配置(如规则链、邮件服务器设置)。
  • 数据隔离:Customer 用户通过 REST API 或 MQTT 请求数据时,ThingsBoard 会自动在查询条件中附加 customerId 过滤,确保不会返回其他客户的数据。
常见误区: 不要将 Customer 用户视为“受限的 Tenant 管理员”。Customer 用户没有管理用户、创建规则链或修改系统设置的权限。如果业务需要更细粒度的控制,必须使用 ThingsBoard 的 RBAC(基于角色的访问控制)功能。

3.2.2 资源分配与权限模型

Tenant 将资源分配给 Customer 的过程称为 Assignment(分配)。分配后,Customer 用户才能看到并使用这些资源。分配的资源类型包括:

资源类型 分配方式 Customer 用户权限
设备 在设备详情页中指定所属 Customer 查看遥测数据、属性、发送 RPC 命令(需额外授权)
资产 在资产详情页中指定所属 Customer 查看资产信息、关联的设备列表
仪表板 在仪表板详情页中分配 Customer 或 Customer 用户 查看仪表板内容(只读或可编辑,取决于分配时的设置)
实体组 创建实体组后,将 Customer 添加为组成员 查看组内所有实体,便于批量管理

下图展示了 Tenant 如何将设备资源分配给不同的 Customer,并形成数据访问边界:

资源分配与权限边界示意图 Tenant 资源池 设备集群 设备 D1, D2, D3 设备 D4, D5 Customer A 已分配设备:D1, D2 可查看遥测、属性 不可见 D3, D4, D5 Customer B 已分配设备:D3, D4 可查看遥测、属性 不可见 D1, D2, D5 未分配 设备 D5 仅 Tenant 可见 权限边界:每个 Customer 只能看到自己被分配的设备,无法跨越边界访问其他 Customer 或未分配的资源。

3.3 多租户数据隔离机制

ThingsBoard 在数据库层面和 API 层面都实施了严格的隔离策略:

  • 数据库隔离:所有实体表(如 device、asset、alarm)都包含 tenant_id 和 customer_id 字段。查询时自动附加这些字段作为过滤条件。
  • API 隔离:REST API 和 WebSocket API 在解析请求时,会从 JWT Token 中提取用户角色和所属租户/客户信息,拒绝越权访问。
  • 规则链隔离:规则链属于 Tenant 级别资源。Customer 用户无法创建或修改规则链,但 Tenant 可以创建针对特定 Customer 的规则链节点,实现客户特定的数据处理逻辑。
最佳实践: 在设计 IoT 解决方案时,建议将每个终端客户映射为一个 ThingsBoard Customer。这样既能享受平台提供的天然数据隔离,又能通过 Tenant 统一管理设备模板、规则链和仪表板模板,实现“一次开发,多次部署”的规模化效应。

3.4 实际应用场景示例

假设一个智慧楼宇管理平台(Tenant)为三栋不同的写字楼(Customer A、B、C)提供服务:

  1. Tenant 管理员:创建楼宇设备模型(温度传感器、门禁控制器),编写规则链(告警规则、数据持久化策略),设计通用仪表板模板。
  2. 资源分配:将 A 楼的 50 个传感器分配给 Customer A,B 楼的 30 个传感器分配给 Customer B,C 楼的 20 个传感器分配给 Customer C。
  3. 客户访问:Customer A 的用户登录后,只能看到 A 楼的传感器数据、告警和专属仪表板。无法搜索或访问 B 楼和 C 楼的任何设备。
  4. 数据安全:即使 Customer A 的用户通过 REST API 直接请求设备列表,返回的结果也仅包含 A 楼的设备,实现了强制的数据边界。

通过这种模型,ThingsBoard 在保证多租户数据安全的同时,也提供了灵活的资源管理和规模化扩展能力。