Browse Source

feat: 引入jpa多租户

初步引入jpa多租户
晨辉 1 year ago
parent
commit
c149282006

+ 5 - 1
iot-common/iot-common-satoken/pom.xml

@@ -39,7 +39,11 @@
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-common-redis</artifactId>
         </dependency>
-
+        
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>iot-common-tenant</artifactId>
+        </dependency>
         <dependency>
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-common-web</artifactId>

+ 13 - 0
iot-common/iot-common-satoken/src/main/java/cc/iotkit/common/satoken/config/SaTokenConfig.java

@@ -2,12 +2,15 @@ package cc.iotkit.common.satoken.config;
 
 import cc.iotkit.common.satoken.core.dao.PlusSaTokenDao;
 import cc.iotkit.common.satoken.core.service.SaPermissionImpl;
+import cc.iotkit.common.tenant.interceptor.TenantInterceptor;
 import cn.dev33.satoken.dao.SaTokenDao;
 import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
 import cn.dev33.satoken.stp.StpInterface;
 import cn.dev33.satoken.stp.StpLogic;
+import lombok.RequiredArgsConstructor;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.context.annotation.Bean;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 /**
@@ -15,8 +18,12 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  *
  * @author Lion Li
  */
+
+@RequiredArgsConstructor
 @AutoConfiguration
 public class SaTokenConfig implements WebMvcConfigurer {
+    
+    private final TenantInterceptor tenantInterceptor;
 
     @Bean
     public StpLogic getStpLogicJwt() {
@@ -40,4 +47,10 @@ public class SaTokenConfig implements WebMvcConfigurer {
         return new PlusSaTokenDao();
     }
 
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addWebRequestInterceptor(tenantInterceptor);
+    }
+
+
 }

+ 5 - 0
iot-common/iot-common-tenant/pom.xml

@@ -27,6 +27,10 @@
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-common-satoken</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
 
     </dependencies>
 
@@ -39,6 +43,7 @@
                     <source>${java.version}</source>
                     <target>${java.version}</target>
                 </configuration>
+
             </plugin>
         </plugins>
     </build>

+ 5 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/dao/entiry/TenantAware.java

@@ -0,0 +1,5 @@
+package cc.iotkit.common.tenant.dao.entiry;
+
+public interface TenantAware {
+    void setTenantId(String tenantId);
+}

+ 34 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/interceptor/TenantInterceptor.java

@@ -0,0 +1,34 @@
+package cc.iotkit.common.tenant.interceptor;
+
+import cc.iotkit.common.tenant.util.TenantContext;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.context.request.WebRequestInterceptor;
+
+@Component
+@Slf4j
+public class TenantInterceptor implements WebRequestInterceptor {
+
+    public static final String TENANT_ID = "TENANT-ID";
+
+
+    @Override
+    public void preHandle(WebRequest request) {
+        if (request.getHeader(TENANT_ID) != null) {
+            String tenantId = request.getHeader(TENANT_ID);
+            TenantContext.setTenantId(tenantId);
+        }
+    }
+
+    @Override
+    public void postHandle(WebRequest request, ModelMap model) {
+        TenantContext.clear();
+    }
+
+    @Override
+    public void afterCompletion(WebRequest request, Exception ex) {
+
+    }
+}

+ 18 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/listener/TenantListener.java

@@ -0,0 +1,18 @@
+package cc.iotkit.common.tenant.listener;
+
+import cc.iotkit.common.tenant.dao.entiry.TenantAware;
+import cc.iotkit.common.tenant.util.TenantContext;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PreRemove;
+import javax.persistence.PreUpdate;
+
+public class TenantListener {
+    @PreUpdate
+    @PreRemove
+    @PrePersist
+    public void setTenant(TenantAware entity) {
+        final String tenantId = TenantContext.getTenantId();
+        entity.setTenantId(tenantId);
+    }
+}

+ 21 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/util/TenantContext.java

@@ -0,0 +1,21 @@
+package cc.iotkit.common.tenant.util;
+
+public class TenantContext {
+    private TenantContext() {
+    }
+
+    private static final ThreadLocal<String> tenantInfoHolder = new InheritableThreadLocal<>();
+
+    public static void setTenantId(String tenantId) {
+        tenantInfoHolder.set(tenantId);
+    }
+
+    public static String getTenantId() {
+        return tenantInfoHolder.get();
+    }
+
+    public static void clear() {
+        tenantInfoHolder.remove();
+    }
+
+}