【RuoYi-SpringBoot3-Pro】:多租户功能上手指南

【RuoYi-SpringBoot3-Pro】:多租户功能上手指南

做 SaaS 系统最头疼的是什么?肯定是数据隔离。

RuoYi-SpringBoot3-Pro 直接集成了 MyBatis-Plus 的多租户插件(TenantLineInnerInterceptor),不用再关注租户 ID,框架层自动给你注入过滤条件。配合 使用 Dify + AI 快速生成多数据库建表语句,使开发效率直线提升!

开启配置

多租户功能默认是关闭的。在 ruoyi-admin 下面的 application.yml 里找 tenant 配置:

yaml 复制代码
tenant:
  enable: true # 把它改成 true,多租户就生效了
  column: tenant_id # 你的表里用来区分租户的字段名,一般都叫 tenant_id
  filterTables: # 这里的表,会强制进行 SQL 过滤
  ignoreTables: # 这些表是不进行租户隔离的
    - sys_user # 用户表
    - sys_role # 角色表
    - sys_menu # 菜单表
    - sys_dept # 部门表
    - sys_dict_data # 字典数据
    # ... 省略其它系统表
  ignoreLoginNames: # 超级管理员,让他能看所有租户的数据
    - admin

由于 RuoYi-SpringBoot3-Pro 是在 RuoYi-Vue3 基础上的增强版,本着只做增强,不做改变 的原则,原来系统的表只在 sys_user 中添加了 tenant_id。有需要的小伙伴需要自行扩展。

实现代码

就像开头所说,其实实现特别简单,就是用 MyBatis-Plus 的拦截器。

在 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java,中设置:

java 复制代码
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(TenantProperties tenantProperties) {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    if (Boolean.TRUE.equals(tenantProperties.getEnable())) {
        // 启用多租户插件拦截
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new MultiTenantHandler(tenantProperties)));
    }
    // ...
    return interceptor;
}

它注册了一个 TenantLineInnerInterceptor,并传入了一个 MultiTenantHandler。这个 Handler 位于 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java,它会:

  1. 从当前登录用户信息里取出 tenantId。
  2. 判断当前表需不需要隔离(看是不是在 ignoreTables 里)。
  3. 如果需要隔离,就在你的 SQL 后面自动追加 AND tenant_id = 123。

注意事项

  • 多租户不等于权限过滤,租户之间是完全隔离的。
  • 由于多租户ID 是从当前登录用户信息获取,所以像定时任务的处理,需要自行根据业务逻辑判断。
  • 启用多租户后,所有执行的 method 的 SQL 都会进行处理。
  • 自定义的 SQL 请按规范书写,特别是涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join。

往期教程合集

RuoYi-SpringBoot3-Pro

相关推荐
136096757239 分钟前
一台 4 核 8G 已经跑了 6 个站点,我是怎么把第 7 个塞进去的
后端
对象存储与RustFS11 分钟前
JuiceFS + 对象存储:把 S3 变成 POSIX 文件系统实测
后端·rust·开源
她的男孩20 分钟前
企业接口照样拦得住:独立 Flyway、@RequiresFeature 与离线许可证
java·spring boot·后端
十年Java程序媛20 分钟前
Lambda 与函数式接口|别只会复制 ()->{},底层规则和坑一次性讲清
java·spring boot·后端
yunwei3721 分钟前
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
linux·后端·性能优化
全栈Agent 小李25 分钟前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
高频因子挖掘机27 分钟前
历史 K 线突然少一天?用交易日历、停牌信息和数据校验逐步排查
后端·github·api
行者全栈架构师1 小时前
从 55% 到 6%:一个快餐营养规划器的算法迭代实录
后端·算法·架构
余槐i1 小时前
无慢查询 RT 却飙升:cProfile 定位 FastAPI 事件循环阻塞
后端·python·性能优化·fastapi·asyncio
AINative软件工程1 小时前
LLM 应用的 Adaptive Batching 工程实践:动态合批把吞吐提升 3 倍,但延迟的坑你踩过吗
后端·llm·ai编程