目录
1.使用mybatis-plus多租户插件
导入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency>
1.实现TenantHandler租户接口
2.设置字段为org_id(所有相关的表都要添加这个字段)
3.获取前端登录时传递的组织ID(这个是针对第一次登录没有token,因为后续如果已经登录就可以获取到对应的组织id编号了)
4,如果有些相关的表是共享的不需要做组织隔离那么请在doTableFilte方法中添加对应的表
package com.sys.handler;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import com.sys.entity.User;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.NullValue;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class PreTenantHandler implements TenantHandler {
/**
*
* @param where 参数 true 表示为 where 条件 false 表示为 insert 或者 select 条件
* @return 这里获取租户id的实际值,也就是从登陆用户中获取未登录由前端选择的组织id获取
*/
@Override
public Expression getTenantId(boolean where) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 判断用户是否已登录 未登陆从登陆请求头里面获取用户的组织id
Subject subject = SecurityUtils.getSubject();
boolean isAuthenticated = subject.isAuthenticated();
if (isAuthenticated) {
// 用户已登录
User principal = (User) subject.getPrincipal();
Integer id = principal.getOrgId();
return new LongValue(id);
} else if (servletRequestAttributes != null){
// 用户未登录通过用户选择的园区获取数据
int org = Integer.parseInt(servletRequestAttributes.getRequest().getHeader("org"));
return new LongValue(org);
}
return new NullValue();
}
/**
*
* @return 这类填写的是表中的字段
*/
@Override
public String getTenantIdColumn() {
return "org_id";
}
/**
* @param tableName 表名
* @return 这里看是否需要忽略哪些表 true为忽略,false为不忽略 后面做到yml配置文件里面去
*/
@Override
public boolean doTableFilter(String tableName) {
if (tableName.contains("ACT_"))
return true; //去除流程相关的表
if (tableName.contains("act_"))
return true;//去除流程相关的表
}
}
异常问题
1.如果某个查询不想使用组织ID查询怎么办,例如对外接口,那么就没有登录,但是你在查询的时候插件会自动添加org_id这个字段,那么就使用
@SqlParser(filter = true)//这个注解即可@SqlParser(filter = true)
List<MesFile> getReportUrlList(String applyNumber);
2.mybatis-plus 多租户 lef join bug 会重复on导致sql语句报错
这个时候查询系统是否引入了jsqlparser解析器,原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器 。
解决方法
排除pagehelper-spring-boot-starter的jar中的jsqlparser依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>mybatis-spring</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>