【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. 从当前登录用户信息里取出
tenantId。2. 判断当前表需不需要隔离(看是不是在
ignoreTables里)。3. 如果需要隔离,就在你的 SQL 后面自动追加
AND tenant_id = 123。
注意事项
• 多租户不等于权限过滤,租户之间是完全隔离的。
• 由于多租户ID 是从当前登录用户信息获取,所以像定时任务的处理,需要自行根据业务逻辑判断。
• 启用多租户后,所有执行的 method 的 SQL 都会进行处理。
• 自定义的 SQL 请按规范书写,特别是涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join。
引用链接
[1]RuoYi-SpringBoot3-Pro:https://github.com/undsky/RuoYi-SpringBoot3-Pro