SaaS / 多租户:现状与缺口
本文与主仓行为对齐,便于产品或二开团队在 单库行级多租户 基础上规划「真 SaaS」。若与代码不一致,以 mms 仓库源码 为准并回写本文档。
现状(已实现)
| 能力 | 说明 |
|---|---|
| 租户行级隔离 | tenant.enable 时 MyBatis-Plus TenantLineInnerInterceptor,字段名可配置(默认 tenant_id) |
| 排除表 | tenant.exclusionTable + 表名前缀 sys_gen_ 不参与租户条件 |
| 租户开关 | tenant.enable=false 时不注册租户插件;enable 为空按未开启处理 |
| 租户实体 | sys_tenant:状态、域名、packageId、过期时间 expireTime、账号额度字段 accountCount 等 |
| 租户套餐表 | sys_tenant_package:functionIds(关联菜单 ID 串)、status |
| 登录租户校验 | 已实现:租户存在且启用;过期时间(expireTime 不为空且未晚于当前时间则拒绝);若填写 packageId 则套餐须存在且 status 为启用 |
| 登录租户上下文 | LoginObject.getLoginTenant() → Redis,回落 000000 |
| 演示/运维 | 管理端入口 mms-admin,脚本参考 script/db/mms.sql |
缺口(未实现或仅部分具备)
| 方向 | 说明 |
|---|---|
| 套餐能力裁剪 | SysTenantPackage.functionIds 已存在字段;登录后菜单/API 是否按套餐过滤 需与 sys_function、前端路由统一设计(当前仍以角色权限为主) |
| 账号数配额 | sys_tenant.accountCount 未在注册/邀请链路强制;可在创建用户前校验租户下用户数 |
| 计费 / 订单 | 无统一计费模块;与套餐到期可结合业务表扩展 |
| 限流与隔离 | API 限流、存储配额、OSS 按租户分桶等多为 运维/业务层 扩展 |
| 分库分表 / 独立库 | 当前为 单库 + tenant_id;大租户独立库需多数据源与路由策略 |
| 域名 / 子域名解析租户 | sys_tenant.domain 已有;需在网关或 Filter 中解析并写入登录前上下文(与现有按参数/用户表租户并存) |
| 跨租户运营 | 超级管理员跨租户查看数据需专列权限与审计 |
过期策略边界:当前以「expireTime 不晚于当前时刻则禁止登录」理解;若业务要求「到期日为当天仍全天可用」,需在库里存 当天结束时间 或改为 按日期比较。
与实现的对应(代码入口)
- 登录租户与套餐校验:
SysLoginServiceImpl#verfyTenement - 套餐查询:
SysTenantPackageService/SysTenantPackageMapper - 行级租户插件:
MybatisPlusConfig(mms-datasource)
相关文档:多租户 · 项目简介 — 子模块速览
