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

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

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

开启配置

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


    
    
    
  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,中设置:


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

注意事项

往期教程合集

RuoYi-SpringBoot3-Pro

引用链接

[1] RuoYi-SpringBoot3-Pro: https://github.com/undsky/RuoYi-SpringBoot3-Pro