RuoYi-Vue-Plus 多租户后台管理系统:把数据隔离做进框架,把交付周期压到三周
选型现场的三个困境。第一,客户要 SaaS 后台,租户隔离、角色权限、审批流、对象存储一个都不能少,自研基础能力就要 2-3 个月。第二,选了老牌单体框架,改造到一半发现权限体系扩展性差、缓存不支持集群、多数据源要手写配置,改造成本比自研还高。第三,多租户靠开发人员自觉拼 tenant_id,一个查询漏条件,A 租户就能看到 B 租户的数据,这属于安全事故。三个问题指向同一个结论:你需要一个把数据隔离、认证授权、缓存、多数据源做成框架内置能力的多租户后台管理系统。RuoYi-Vue-Plus 正是按这个思路重写的——版本 6.0.0,MIT 协议可商用。
30 秒建立认知。它是什么:基于 Spring Boot 4.1 + JDK 21 的后台管理系统,技术栈为 Sa-Token、Mybatis-Plus 3.5.17、Redisson 4.6.1、WarmFlow 1.8.9。能解决什么:多租户数据隔离、RBAC 权限、5 种登录方式(密码/邮箱/短信/社交/小程序)、工作流、代码生成、对象存储、分布式任务调度。适合谁:快速交付后台的中小团队、做多租户 SaaS 的产品团队。不适合谁:只要三个页面的微型项目——框架本身有学习成本,此时用它是负担。
多租户后台管理系统的最小闭环:从克隆到登录。按以下步骤 30 分钟可跑通:
- 准备 JDK 21、Maven 3.6+、MySQL 5.7+(或 PostgreSQL/Oracle/SQLServer)、Redis 6.0+。
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus。 - 初始化数据库:执行
script/sql/ry_vue.sql,需要工作流与定时任务再执行ry_workflow.sql、ry_job.sql,四种数据库方言脚本齐全。 - 修改
ruoyi-admin/src/main/resources/application-dev.yml中的数据源与 Redis 地址。 - 启动
ruoyi-admin模块的DromaraApplication,默认账号admin/admin123。 - 验证登录、看到租户管理菜单,即闭环完成。
整个工程是多模块 Maven 项目,根 pom.xml 用 ${revision} 统一 6.0.0 版本,子模块无需各自维护版本号。多数据源只需一份 YAML 声明,不必写 Java 配置类:
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://localhost:3306/ruoyi_vue_plus
username: root
password: your_password
这段配置在做什么:基于 dynamic-datasource 4.5.0 声明主数据源,切换异构库只需新增数据源块。
由表及里,拆解多租户数据隔离的三层实现。
第一层:插件化模块边界。工程分五个顶层模块:ruoyi-admin(入口)、ruoyi-common(17 个通用组件)、ruoyi-modules(system/gen/job/workflow/ai)、ruoyi-extend(监控、AI 与任务服务器)、ruoyi-api(跨模块接口)。价值结论:按依赖方向分层,业务模块只依赖 common 与 api,新增业务模块不用改动任何既有模块。
第二层:数据隔离与权限注入的实现取舍。多租户与数据权限在 MyBatis 拦截器层完成,MybatisPlusConfig 组装数据权限拦截器、分页插件、乐观锁插件,业务代码里看不到租户条件拼接。核心取舍对比如下:
| 维度 | 自研/传统方案 | RuoYi-Vue-Plus 方案 |
|---|---|---|
| 租户隔离 | Service 层手写条件,易漏 | 拦截器自动注入,Mapper 无感 |
| 权限体系 | Spring Security 配置繁琐 | Sa-Token 注解,支持 AND/OR 表达式 |
| 主键策略 | 数据库自增,跨库冲突 | 雪花 ID,绑定网卡防集群重复 |
| 缓存客户端 | Lettuce + RedisTemplate | Redisson,覆盖 90%+ 命令,keys 自动转 scan |
| 多数据源 | 手写 Java 配置 | YAML 即配即用,支持异构切换 |
第三层:认证与传输安全。AuthController 走 OAuth 风格,请求带 clientId + grantType,由 IAuthStrategy 分发到 PasswordAuthStrategy、SmsAuthStrategy 等五个实现类;登录接口标 @ApiEncrypt,用动态 AES+RSA 加密请求体,每次请求密钥不同。权限声明同样放在方法上:
@SaCheckPermission("system:user:list")
@GetMapping("/list")
public R<PageResult<SysUserVo>> list(SysUserBo bo) {
return R.ok(sysUserService.selectPageUserList(bo));
}
这段代码在做什么:用 Sa-Token 注解声明接口权限,权限与登录校验直接绑定在方法签名上,天然支持角色、权限、二级认证的组合表达式。
可验证的证据。版本底座:Spring Boot 4.1.0、JDK 21、Sa-Token 1.45.0、Hutool 5.8.47、SnailJob 2.0.2、Lock4j 2.2.7。数据库覆盖:原生 MySQL/Oracle/PostgreSQL/SQLServer,达梦、金仓有成功案例。效率证据:代码生成器把单表 CRUD 从手写 2-3 天压到 5 分钟,前端页面与接口文档一并产出。可靠性证据:分布式锁用 Lock4j,调度用 SnailJob,天然支持分片与重试;ruoyi-extend 内置 Spring Boot Admin 监控服务端。
避坑手册。
| 现象 | 根因 | 解法 |
|---|---|---|
| 启动报 Spring 版本不兼容 | JDK 不是 21 | 安装 JDK 21,并同步 Maven 编译 target |
| MySQL 连接失败 | 8.x 默认 caching_sha2_password 认证 | 建库用户改用 mysql_native_password 或升级驱动 |
| Redis 命令报错 | 实例版本低于 6.0 | 升级到 Redis 6.0+,项目大量依赖新特性 |
| 新增表查询无租户条件 | 新表未纳入租户策略 | 在租户表配置中登记表名,不要只改业务代码 |
| Maven 依赖下载失败 | 网络或仓库问题 | 使用项目内置的华为云镜像仓库或自配镜像源 |
落地建议与演进路线。轻量试水(1 天):用 script/docker/docker-compose.yml 一键拉起 MySQL 与 Redis,跑通 admin,重点验证租户切换与代码生成。深度集成(1-2 周):接入 WarmFlow 工作流做审批流;用 AWS S3 协议客户端接阿里云/腾讯云对象存储;以 ruoyi-gen 生成的新模块作为业务起点。演进判断:项目持续同步 Spring Boot 4 生态,并新增 AI 模块(ruoyi-ai、SnailAI 服务端),方向是分布式调度与智能化,短期无弃坑风险。
收束:一张决策清单。如果诉求是"三个月内交付多租户 SaaS 后台",以下条件满足任意两条即可直接采用:需要租户级数据隔离且不容出错;需要 5 种以上登录方式或复杂权限表达式;需要工作流、代码生成、对象存储组合;团队熟悉 Spring Boot + Mybatis-Plus 生态。
给三类读者的一句话建议。决策者:先用 docker-compose 跑通演示环境再拍板,重点验证多租户切换与代码生成效率。开发者:别急着改框架源码,先读 ruoyi-common-mybatis 的拦截器链,理解租户与数据权限的注入点。维护者:跟随主干升级时,先看根 pom.xml 的依赖版本变更说明,再决定是否合入自己的分支。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



