当前位置: 首页 > news >正文

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

【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

注意事项

  • • 多租户不等于权限过滤,租户之间是完全隔离的。

  • • 由于多租户ID 是从当前登录用户信息获取,所以像定时任务的处理,需要自行根据业务逻辑判断。

  • • 启用多租户后,所有执行的 method 的 SQL 都会进行处理。

  • • 自定义的 SQL 请按规范书写,特别是涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join。

引用链接

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

http://www.jsqmd.com/news/245382/

相关文章:

  • 这份无线联网智能门锁系统清单非常专业,清晰地勾勒出了一套适用于多业态、高流动性、强管理场景的现代化出入口解决方案。这不仅是设备清单,更是一套“去中心化部署、云端化管理”的智慧运营蓝图。
  • 对象库未注册-VB6企业版控件加载不了MSCOMCTL.ocx
  • 提示工程架构师经验:如何用Prompt解决客服复杂问题?
  • 动漫生成服务SLA保障:AnimeGANv2高可用部署架构
  • go语言对phone脱敏显示
  • 通义千问2.5-7B-Instruct优化技巧:RTX 3060流畅运行指南
  • AnimeGANv2如何提高边缘清晰度?后处理滤波技术实战
  • 农业机械收割机拖拉机数据集6340张VOC+YOLO格式
  • 开源模型新选择:AnimeGANv2宫崎骏风格迁移实战指南
  • keil5安装包下载通俗解释:新手也能轻松掌握
  • AnimeGANv2优化指南:处理高分辨率图片的配置建议
  • 车辆及人数据集(汽车公交车收割机拖拉机卡车人)12819张
  • AnimeGANv2从零开始:构建二次元转换器完整流程
  • Qt 线程管理:从 QThread 到 QThreadPool
  • 物理约束机器学习赋能科学计算
  • 彻底解析Java访问修饰符:public、private、protected及默认的区别
  • AnimeGANv2代码实例:Python调用模型避坑指南
  • 一键部署通义千问2.5-7B-Instruct,AI应用开发从未如此简单
  • 手把手教程:用通义千问2.5-7B和vLLM实现代码补全功能
  • Windows 10/11 优化大师 Windows Manager
  • hal_uart_transmit支持多协议切换的控制系统设计方案
  • AnimeGANv2实战:动漫风格社交媒体广告
  • access数据库损坏后的修复方法
  • QProcess调用外部程序
  • VibeThinker-1.5B值得部署吗?数学与编程双项评测教程
  • AnimeGANv2如何实现美颜效果?人脸优化算法深度解析
  • 微博开源模型实战:VibeThinker-1.5B WEBUI界面使用详解
  • 导师推荐!8款AI论文软件测评,本科生毕业论文必备
  • VibeVoice-TTS模型更新机制:版本升级与回滚操作
  • Keil环境下51单片机流水灯代码生成操作指南