Skip to content

多租户管理 ​

平台采用「主库 + tenant_* 动态库」的多租户架构,租户数据物理隔离,互不可见(Phase 3 起全量落地)。

架构模型 ​

mingshang(主库)
 ├── ms_tenant          # 租户注册表
 ├── ms_user            # 全局用户
 └── ms_product ...     # 平台级元数据

tenant_1, tenant_2 ...(租户动态库)
 ├── ms_device          # 该租户的设备
 ├── ms_alert           # 该租户的告警
 └── ...                # 业务数据按租户分库

工作原理 ​

  • 认证通过后,TenantContext(ThreadLocal)写入当前租户 ID。
  • MyBatis 拦截器自动为 SQL 追加租户条件,业务代码无需感知租户逻辑。
  • 协议接入层(TCP / CoAP / HTTP / EMQX Webhook)需要跨租户检索设备, 使用 DeviceMapper.selectBySerialIgnoreTenant(标注 @InterceptorIgnore tenantLine) 在「主库 + 全部 tenant_* 库」中全局检索 serial 完成认证,认证后回落到对应租户上下文。

管理接口 ​

http
GET  /api/tenant/list        # 租户列表
POST /api/tenant/save        # 创建/更新租户(自动建 tenant_N 库并初始化表结构)
POST /api/tenant/enable/{id}
POST /api/tenant/disable/{id}
GET  /api/tenant/{id}/quota  # 配额使用情况(设备数/消息量)

RBAC 权限 ​

角色范围
平台超管全部租户 + 平台配置
租户管理员本租户内全部资源 + 用户管理
运维本租户设备 / 告警 / 规则
只读仅查看

权限基于 Sa-Token 注解式鉴权,接口粒度控制。

注意事项 ​

  • 新建租户会动态创建 tenant_{id} 数据库并执行初始化脚本,需保证数据库账号有 CREATE 权限。
  • 删除租户不会物理删库,仅停用并归档,避免误删数据。
  • 平台级元数据(产品模板等)放主库,全租户共享。