iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能
  • 291
分享到

基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能

2023-06-21 20:06:15 291人浏览 安东尼
摘要

这篇文章主要介绍基于mybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!多租户技术的基本概念:多租户技术(英语:multi-t

这篇文章主要介绍基于mybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

多租户技术的基本概念:

多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。
云计算的加持之下,多租户技术被广为运用于开发云各式服务,不论是IaaS,PaaS还是SaaS,都可以看到多租户技术的影子。

前面介绍过gitEgg框架数据库交互使用了Mybatis增强工具Mybatis-Plus,Mybatis-Plus提供了TenantLineInnerInterceptor租户处理器来实现多租户功能,其原理就是Mybatis-Plus实现了自定义Mybatis拦截器(Interceptor),在需要执行的sql后面自动添加租户的查询条件,实际和分页插件,数据权限拦截器是同样的实现方式。

简而言之多租户技术就是可以让一套系统通过配置给不同的客户提供服务,每个客户看到的数据都是属于自己的,就好像每个客户都拥有自己一套独立完善的系统。

下面是在GitEgg系统的应用配置:

在gitegg-platfORM-mybatis工程下新建多租户组件配置文件TenantProperties.java和TenantConfig.java,TenantProperties.java用于系统读取配置文件,这里会在Nacos配置中心设置多组户的具体配置信息,TenantConfig.java是插件需要读取的配置有三个配置项:
TenantId租户ID、TenantIdColumn多租户的字段名、ignoreTable不需要多租户隔离的表。
TenantProperties.java:

package com.gitegg.platform.mybatis.props;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import java.util.List;@Data@Configuration@ConfigurationProperties(prefix = "tenant")public class TenantProperties {        private Boolean enable;        private String column;        private List<string> exclusionTable;}

TenantConfig.java:

package com.gitegg.platform.mybatis.config;import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;import com.gitegg.platform.boot.util.GitEggAuthUtils;import com.gitegg.platform.mybatis.props.TenantProperties;import lombok.RequiredArgsConstructor;import net.sf.jsqlparser.expression.Expression;import net.sf.jsqlparser.expression.NullValue;import net.sf.jsqlparser.expression.StringValue;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.AutoConfigureBefore;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@RequiredArgsConstructor(onConstructor_ = @Autowired)@AutoConfigureBefore(MybatisPlusConfig.class)public class TenantConfig {private final TenantProperties tenantProperties;@Beanpublic TenantLineInnerInterceptor tenantLineInnerInterceptor() {return new TenantLineInnerInterceptor(new TenantLineHandler() {@Overridepublic Expression getTenantId() {String tenant = GitEggAuthUtils.getTenantId();if (tenant != null) {return new StringValue(GitEggAuthUtils.getTenantId());}return new NullValue();}@Overridepublic String getTenantIdColumn() {return tenantProperties.getColumn();}@Overridepublic boolean ignoreTable(String tableName) {return tenantProperties.getExclusionTable().stream().anyMatch((t) -> t.equalsIgnoreCase(tableName));}});}}

可在工程下新建application.yml,配置将来需要在Nacos上配置的信息:

tenant:  # 是否开启租户模式  enable: true  # 需要排除的多租户的表  exclusionTable:    - "t_sys_district"    - "oauth_client_details"  # 租户字段名称  column: tenant_id

修改MybatisPlusConfig.java,把多租户过滤器加载进来使其生效:

package com.gitegg.platform.mybatis.config;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;import com.gitegg.platform.mybatis.props.TenantProperties;import lombok.RequiredArgsConstructor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@RequiredArgsConstructor(onConstructor_ = @Autowired)@MapperScan("com.gitegg.**.mapper.**")public class MybatisPlusConfig {    private final TenantLineInnerInterceptor tenantLineInnerInterceptor;    private final TenantProperties tenantProperties;        @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        //多租户插件        if (tenantProperties.getEnable()) {            interceptor.addInnerInterceptor(tenantLineInnerInterceptor);        }        //分页插件        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));        //防止全表更新与删除插件: BlockAttackInnerInterceptor        BlockAttackInnerInterceptor blockAttackInnerInterceptor = new BlockAttackInnerInterceptor();        interceptor.addInnerInterceptor(blockAttackInnerInterceptor);        return interceptor;    }        @Bean    public OptimisticLockerInnerInterceptor optimisticLockerInterceptor() {        return new OptimisticLockerInnerInterceptor();    }}

在GitEggAuthUtils方法中新增获取租户信息的公共方法,租户信息在Gateway进行转发时进行设置,后面会说明如何讲租户信息设置到Header中:

package com.gitegg.platform.boot.util;import cn.hutool.JSON.JSONUtil;import com.gitegg.platform.base.constant.AuthConstant;import com.gitegg.platform.base.domain.GitEggUser;import org.springframework.util.StringUtils;import javax.servlet.Http.httpservletRequest;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;public class GitEggAuthUtils {        public static GitEggUser getCurrentUser() {        HttpServletRequest request = GitEggWEBUtils.getRequest();        if (request == null) {            return null;        }        try {            String user = request.getHeader(AuthConstant.HEADER_USER);            if (StringUtils.isEmpty(user))            {                return null;            }            String userStr = URLDecoder.decode(user,"UTF-8");            GitEggUser gitEggUser = JSONUtil.toBean(userStr, GitEggUser.class);            return gitEggUser;        } catch (UnsupportedEncodingException e) {            e.printStackTrace();            return null;        }    }        public static String getTenantId() {        HttpServletRequest request = GitEggWebUtils.getRequest();        if (request == null) {            return null;        }        try {            String tenantId = request.getHeader(AuthConstant.TENANT_ID);            String user = request.getHeader(AuthConstant.HEADER_USER);            //如果请求头中的tenantId为空,那么尝试是否能够从登陆用户中去获取租户id            if (StringUtils.isEmpty(tenantId) && !StringUtils.isEmpty(user))            {                String userStr = URLDecoder.decode(user,"UTF-8");                GitEggUser gitEggUser = JSONUtil.toBean(userStr, GitEggUser.class);                if (null != gitEggUser)                {                    tenantId = gitEggUser.getTenantId();                }            }            return tenantId;        } catch (UnsupportedEncodingException e) {            e.printStackTrace();            return null;        }    }}

GitEgg-Cloud工程中gitegg-gateway子工程的AuthGlobalFilter增加设置TenantId的过滤方法

  String tenantId = exchange.getRequest().getHeaders().getFirst(AuthConstant.TENANT_ID);        String token = exchange.getRequest().getHeaders().getFirst(AuthConstant.Jwt_TOKEN_HEADER);        if (StrUtil.isEmpty(tenantId) && StrUtil.isEmpty(token)) {            return chain.filter(exchange);        }        Map<string, string=""> addHeaders = new HashMap<>();        // 如果系统配置已开启租户模式,设置tenantId        if (enable && StrUtil.isEmpty(tenantId)) {            addHeaders.put(AuthConstant.TENANT_ID, tenantId);        }

以上为后台的多租户功能集成步骤,在实际项目开发过程中,我们需要考虑到前端页面在租户信息上的配置,实现思路,不用的租户拥有不同的域名,前端页面根据当前域名获取到对应的租户信息,并在公共请求方法设置TenantId参数,保证每次请求能够携带租户信息。

// request interceptorrequest.interceptors.request.use(config => {  const token = storage.get(ACCESS_TOKEN)  // 如果 token 存在  // 让每个请求携带自定义 token 请根据实际情况自行修改  if (token) {    config.headers['Authorization'] = token  }  config.headers['TenantId'] = process.env.Vue_APP_TENANT_ID  return config}, errorHandler)

以上是“基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能

本文链接: https://www.lsjlt.com/news/300534.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能
    多租户技术的基本概念: 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或...
    99+
    2024-04-02
  • 基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能
    这篇文章主要介绍基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!多租户技术的基本概念:多租户技术(英语:multi-t...
    99+
    2023-06-21
  • 详解基于MybatisPlus两步实现多租户方案
    1.定义一个TenantLineHandler的实现类: import com.baomidou.mybatisplus.extension.plugins.handler.Te...
    99+
    2024-04-02
  • 基于vue如何实现tree插件
    这篇文章将为大家详细讲解有关基于vue如何实现tree插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。iview提供的控件iview已经很成熟了,如果说我写的控件和iv...
    99+
    2024-04-02
  • 如何MyBatis在使用MyCat实现多租户功能
    本篇文章给大家分享的是有关如何MyBatis在使用MyCat实现多租户功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyCat 基本配置首先针对多租户配置了多个数据库,在 ...
    99+
    2023-05-31
    mybatis mycat
  • 基于flutter sound插件实现录音与播放功能
    目录插件介绍:插件信息:插件使用前的准备工作设置麦克风权限描述权限管理插件 permission_handler音频硬件配置插件 audio_session动画插件常用的方法录音常见...
    99+
    2024-04-02
  • php如何实现插件功能
    本篇内容主要讲解“php如何实现插件功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何实现插件功能”吧!php实现插件功能:1、新建函数文件“function.php”,代码内容是“f...
    99+
    2023-07-04
  • C#如何基于Socket实现多人聊天功能
    这篇文章主要介绍C#如何基于Socket实现多人聊天功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下服务器服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。代码:using ...
    99+
    2023-06-29
  • Redis基于Bitmap实现用户签到功能
    目录功能分析更多应用场景总结 参考资料 很多应用上都有用户签到的功能,尤其是配合积分系统一起使用。现在有以下需求: 签到1天得1积分,连续签到2天得2积分,3天得3积分,3...
    99+
    2024-04-02
  • 基于Redis位图实现用户签到功能
    场景需求 适用场景如签到送积分、签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等。 如果连续签到中断,则重...
    99+
    2024-04-02
  • C#基于Socket实现多人聊天功能
    本文实例为大家分享了C#基于Socket实现多人聊天功能的具体代码,供大家参考,具体内容如下 服务器 服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。 代码: u...
    99+
    2024-04-02
  • 基于Spring实现文件上传功能
    本小节你将建立一个可以接受HTTP multi-part 文件的服务。你将建立一个后台服务来接收文件以及前台页面来上传文件。要利用servlet容器上传文件,你要注册一个MultipartConfigElement类,以往需要在web.xm...
    99+
    2023-05-31
    spring 文件上传 实现文件
  • HBase如何实现多租户
    这篇文章主要介绍了HBase如何实现多租户,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多租户(multi-tenancy technology),参考维基百科定义,它是在探...
    99+
    2023-06-02
  • 如何基于Ajax技术实现无刷新用户登录功能
    这篇文章主要为大家展示了“如何基于Ajax技术实现无刷新用户登录功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何基于Ajax技术实现无刷新用户登录功能”这...
    99+
    2024-04-02
  • 基于PHP的直播功能如何实现?
    随着互联网的不断发展,直播已经成为了一种非常普及的在线娱乐方式。而在直播背后,PHP作为一种非常流行的服务器端编程语言,也扮演着至关重要的角色。今天我们就来探讨一下,基于PHP的直播功能如何实现。一、什么是直播?首先我们需要理解什么是直播,...
    99+
    2023-05-21
    直播 PHP 实现
  • Oracle CDB管理实现多租户管理功能
    目录CDB的管理1.当前容器2.修改CDB的参数3.修改PDB的参数1.使用ALTER DATABASE 命令修改CDB的参数2.使用ALTER DATABASE命令修改CDB的UN...
    99+
    2022-12-08
    Oracle CDB管理 Oracle多租户管理
  • recorder.js如何实现基于Html5录音功能
    这篇文章将为大家详细讲解有关recorder.js如何实现基于Html5录音功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。recorder.jsmicrophone基于HTML5的录音功能,输出格式为...
    99+
    2023-06-09
  • Oracle CDB管理实现多租户管理功能
    目录CDB的管理1.当前容器2.修改CDB的参数3.修改PDB的参数1.使用ALTER DATABASE 命令修改CDB的参数2.使用ALTER DATABASE命令修改CDB的UNDO模式4.CDB和PDB参数保存位置...
    99+
    2022-12-07
    Oracle CDB管理 Oracle多租户管理
  • 基于Mybatis-plus实现多租户架构的全过程
    多租户(Multi-Tenant)是SaaS中的一个重要概念,它是一种软件架构技术,在多个租户的环境下,共享同一套系统实例,并且租户之间的数据具有隔离性,也就是说一个租户不能去访问其...
    99+
    2024-04-02
  • 基于gitee如何实现上传下载文件的功能
    本文小编为大家详细介绍“基于gitee如何实现上传下载文件的功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于gitee如何实现上传下载文件的功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方案的选择文件...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作