多租户管理
平台采用「主库 + 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 权限。 - 删除租户不会物理删库,仅停用并归档,避免误删数据。
- 平台级元数据(产品模板等)放主库,全租户共享。