Skip to content

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_packagefunctionIds(关联菜单 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
  • 行级租户插件:MybatisPlusConfigmms-datasource

相关文档多租户 · 项目简介 — 子模块速览

Released under the MIT License.