package org.ruoyi.common.tenant.config; import cn.dev33.satoken.dao.SaTokenDao; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import org.redisson.config.ClusterServersConfig; import org.redisson.config.SingleServerConfig; import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; import org.ruoyi.common.core.utils.reflect.ReflectUtils; import org.ruoyi.common.redis.config.RedisConfig; import org.ruoyi.common.redis.config.properties.RedissonProperties; import org.ruoyi.common.tenant.core.TenantSaTokenDao; import org.ruoyi.common.tenant.handle.PlusTenantLineHandler; import org.ruoyi.common.tenant.handle.TenantKeyPrefixHandler; import org.ruoyi.common.tenant.manager.TenantSpringCacheManager; import org.ruoyi.common.tenant.properties.TenantProperties; import org.ruoyi.config.MybatisPlusConfig; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import java.util.ArrayList; import java.util.List; /** * 租户配置类 * * @author Lion Li */ @EnableConfigurationProperties(TenantProperties.class) @AutoConfiguration(after = {RedisConfig.class, MybatisPlusConfig.class}) @ConditionalOnProperty(value = "tenant.enable", havingValue = "true") public class TenantConfig { /** * 初始化租户配置 */ @Bean public boolean tenantInit(MybatisPlusInterceptor mybatisPlusInterceptor, TenantProperties tenantProperties) { List interceptors = new ArrayList<>(); // 多租户插件 必须放到第一位 interceptors.add(tenantLineInnerInterceptor(tenantProperties)); interceptors.addAll(mybatisPlusInterceptor.getInterceptors()); mybatisPlusInterceptor.setInterceptors(interceptors); return true; } /** * 多租户插件 */ public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) { return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties)); } @Bean public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) { return config -> { TenantKeyPrefixHandler nameMapper = new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix()); SingleServerConfig singleServerConfig = ReflectUtils.invokeGetter(config, "singleServerConfig"); if (ObjectUtil.isNotNull(singleServerConfig)) { // 使用单机模式 // 设置多租户 redis key前缀 singleServerConfig.setNameMapper(nameMapper); ReflectUtils.invokeSetter(config, "singleServerConfig", singleServerConfig); } ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig"); // 集群配置方式 参考下方注释 if (ObjectUtil.isNotNull(clusterServersConfig)) { // 设置多租户 redis key前缀 clusterServersConfig.setNameMapper(nameMapper); ReflectUtils.invokeSetter(config, "clusterServersConfig", clusterServersConfig); } }; } /** * 多租户缓存管理器 */ @Primary @Bean public CacheManager tenantCacheManager() { return new TenantSpringCacheManager(); } /** * 多租户鉴权dao实现 */ @Primary @Bean public SaTokenDao tenantSaTokenDao() { return new TenantSaTokenDao(); } }