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.平台管理员查看数据时,需要单独处理。
🌟
方案三 优点:数据完全隔离 需要使用租户时单独部署一套系统 🌟🌟🌟

方案一代码

  1. 在SaTokenConfig中添加拦截器
registry.addInterceptor(new TenantInterceptor()).addPathPatterns("/**").excludePathPatterns(excludeUrls);
  1. 在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);
    }
}

以上仅支持一个用户只属于一个租户的场景,更优方式后续更新中

⚠️ **GitHub.com Fallback** ⚠️