SAAS多租户用法 - xinwu-yang/cube-java GitHub Wiki
方案 | 优缺点 | 集成方式 | 推荐程度 |
---|---|---|---|
方案一 | 优点:改动较小 缺点:仅支持后添加的业务表 |
1.在需要做租户的业务表中 添加租户字段(tenant_id)。 2. 在SaTokenConfig 中添加拦截器用于从获取当前登陆用户的租户id,再使用TenantContext.setTenant();方法设置。 3.application.yml配置中增加配置:mybatis-plus.plugin.tenantTables 配置需要租户处理的表 4.在进行操作时,配置了租户的表中,保存数据时需手动保存租户id。 |
🌟🌟 |
方案二 | 优点:数据隔离更好 缺点:改动较大 |
1.需要修改登陆逻辑 2.修改所有添加了租户id的表的保存逻辑 3.修改角色授权逻辑(给用户绑定租户时,需要拷贝菜单,角色等数据存入数据库,并设置租户id为该用户所在租户)包括修改权限时。 4.平台管理员查看数据时,需要单独处理。 |
🌟 |
方案三 | 优点:数据完全隔离 | 需要使用租户时单独部署一套系统 | 🌟🌟🌟 |
- 在SaTokenConfig中添加拦截器
registry.addInterceptor(new TenantInterceptor()).addPathPatterns("/**").excludePathPatterns(excludeUrls);
- 在TenantInterceptor拦截器
package com.tievd.cube.common.handler;
import cn.dev33.satoken.strategy.SaStrategy;
import com.tievd.cube.application.config.mybatis.TenantContext;
import com.tievd.cube.common.util.SystemContextUtil;
import com.tievd.cube.modules.system.model.LoginUser;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
public class TenantInterceptor implements HandlerInterceptor {
public TenantInterceptor() {
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 获取处理method
LoginUser loginUser = SystemContextUtil.currentLoginUser();
String relTenantIds = loginUser.getRelTenantIds();
TenantContext.setTenant(relTenantIds);
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
}