我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
这是简单的起步代码,基于Spring Boot。
1 代码
在一个控制器里添加代码,控制器是带有@Configuration的类,将如下代码添加在控制器类里面:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler()
{
@Override
public Expression getTenantId()
{
//获得当前登录用户的租户id,一般是从cookies里面获取,这里用了固定值
return new LongValue(1234);
}
}));
return interceptor;
}
需要的导入包:
import org.springframework.context.annotation.Bean;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import net.sf.jsqlparser.expression.LongValue;
其余代码无需修改,但是建议删除租户相关的部分,因为如果已经传入租户ID,这个插件什么也不做。
2 完整接口
完整的TenantLineHandler是这样的(来自官方文档):
public interface TenantLineHandler {
/**
* 获取租户 ID 值表达式,只支持单个 ID 值
* <p>
*
* @return 租户 ID 值表达式
*/
Expression getTenantId();
/**
* 获取租户字段名
* <p>
* 默认字段名叫: tenant_id
*
* @return 租户字段名
*/
default String getTenantIdColumn() {
// 如果该字段你不是固定的,请使用 SqlInjectionUtils.check 检查安全性
return "tenant_id";
}
/**
* 根据表名判断是否忽略拼接多租户条件
* <p>
* 默认都要进行解析并拼接多租户条件
*
* @param tableName 表名
* @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
*/
default boolean ignoreTable(String tableName) {
return false;
}
}
一共就三个方法,由于我的表的租户字段名和默认值一致,所以不需要实现更多方法。
3 实测效果
如果没有传入租户ID,就会调用这里定义的getTenantId来获取租户ID,如果已经传入了租户ID,则不会调用。
4 讨论
其实我希望强制覆盖传入的租户ID,这样才能防止出错。
另外数据库里面如何合理实现,还是个问题。
以前发生过事故,用户看到了不该看的东西。
(这里是文档结束)