From: qiaowei Date: Wed, 26 Jun 2019 07:37:57 +0000 (+0800) Subject: 多租户配置 X-Git-Tag: 1.0.0^2~146 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=40a96f2aea365c5c04626f8c88538556587f8cd8;p=epayment%2Ffood_payapi.git 多租户配置 --- diff --git a/build.gradle b/build.gradle index 72ec3a0f..96a615d4 100644 --- a/build.gradle +++ b/build.gradle @@ -53,7 +53,7 @@ dependencies { implementation group: 'taglibs', name: 'standard', version: '1.1.2' implementation group: 'commons-codec', name: 'commons-codec', version: '1.6' implementation files('libs/ojdbc6.jar') - + implementation 'commons-dbcp:commons-dbcp:1.4' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties index 61b2df94..61c327fe 100644 --- a/config/application-devel-pg.properties +++ b/config/application-devel-pg.properties @@ -24,8 +24,19 @@ logging.level.org.springframework.web=DEBUG security.request.sign=false ################################################## ## quartz task scheduler -<<<<<<< HEAD shopbalance.updater.cron=- -======= -shopbalance.updater.cron = - ->>>>>>> 手机端API认证 + +##################多租户配置 start################################ +#多租户时使用的配置,如果不是用多租户,以下可注释掉 +#spring.jpa.properties.hibernate.multiTenancy=DATABASE +#spring.jpa.properties.hibernate.tenant_identifier_resolver=com.supwisdom.dlpay.framework.tenant.MultiTenantIdentifierResolver +#spring.jpa.properties.hibernate.multi_tenant_connection_provider=com.supwisdom.dlpay.framework.tenant.MultiTenantConnectionProviderImpl +#datasource.driverClass=org.postgresql.Driver +#datasource.url=jdbc:postgresql://172.28.201.70:15432/payapi +#datasource.username=payapi +#datasource.password=123456 +#datasource.maxActive=100 +#datasource.maxIdle=30 +#datasource.maxWait=30 +#datasource.minIdle=5 +##################多租户配置 end################################ \ No newline at end of file diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java new file mode 100644 index 00000000..0f1d799f --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java @@ -0,0 +1,20 @@ +package com.supwisdom.dlpay.framework.tenant; + +import org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl; + +import javax.sql.DataSource; + +/** + * Created by shuwei on 2018/12/4. + */ +public class MultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl { + @Override + protected DataSource selectAnyDataSource() { + return TenantDataSourceProvider.getTenantDataSource("default"); + } + + @Override + protected DataSource selectDataSource(String tenantIdentifier) { + return TenantDataSourceProvider.getTenantDataSource(TenantThread.getTenantSchema()); + } +} diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java new file mode 100644 index 00000000..d2dc781f --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java @@ -0,0 +1,21 @@ +package com.supwisdom.dlpay.framework.tenant; + +import org.hibernate.context.spi.CurrentTenantIdentifierResolver; + +/** + * Created by shuwei on 2018/12/4. + */ +public class MultiTenantIdentifierResolver implements CurrentTenantIdentifierResolver { + @Override + public String resolveCurrentTenantIdentifier() { + if(TenantThread.getTenantSchema()==null){ + return "default"; + } + return TenantThread.getTenantSchema(); + } + + @Override + public boolean validateExistingCurrentSessions() { + return true; + } +} diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantDataSourceProvider.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantDataSourceProvider.java new file mode 100644 index 00000000..d93db46a --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantDataSourceProvider.java @@ -0,0 +1,96 @@ +package com.supwisdom.dlpay.framework.tenant; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.sql.DataSource; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by shuwei on 2018/12/4. + */ +@Component +public class TenantDataSourceProvider { + @Value("${datasource.driverClass}") + private String driver; + @Value("${datasource.url}") + private String url; + @Value("${datasource.username}") + private String username; + @Value("${datasource.password}") + private String password; + @Value("${datasource.maxIdle}") + private int maxIdle; + @Value("${datasource.maxActive}") + private int maxActive; + @Value("${datasource.minIdle}") + private int minIdle; + @Value("${datasource.maxWait}") + private int maxWait; + + public static String static_driver; + public static String static_url; + public static String static_username; + public static String static_password; + public static int static_maxIdle; + public static int static_maxActive; + public static int static_minIdle; + public static int static_maxWait; + + + @PostConstruct + public void beforeInit() { + static_driver = driver; + static_url = url; + static_username = username; + static_password = password; + static_maxIdle = maxIdle; + static_maxActive = maxActive; + static_minIdle = minIdle; + static_maxWait = maxWait; + } + // 使用一个map来存储我们租户和对应的数据源,租户和数据源的信息就是从我们的tenant_info表中读出来 + private static Map dataSourceMap = new HashMap<>(); + + /** + * 静态建立一个数据源,也就是我们的默认数据源,假如我们的访问信息里面没有指定tenantId,就使用默认数据源。 + * 在我这里默认数据源是cloud_config,实际上你可以指向你们的公共信息的库,或者拦截这个操作返回错误。 + */ + // 根据传进来的tenantId决定返回的数据源 + public static DataSource getTenantDataSource(String schemaId) { + DataSource d = dataSourceMap.get(schemaId); + if (d == null) { + String appSchema = schemaId != null ? "'" + schemaId + "','public'" : "'public'"; + String searchPath = "SET search_path = " + appSchema + ";"; + d = createDataSource(schemaId == null, searchPath); + dataSourceMap.put(schemaId, d); + } + return d; + } + + // 初始化的时候用于添加数据源的方法 + public static DataSource createDataSource(boolean rootdatabase, String searchPath) { + BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(static_driver); + dataSource.setUrl(static_url); + dataSource.setUsername(static_username); + dataSource.setPassword(static_password); + dataSource.setMaxActive(static_maxActive); + dataSource.setMaxIdle(static_maxIdle); + dataSource.setMaxWait(static_maxWait); + dataSource.setMinIdle(static_minIdle); + if(static_driver.toLowerCase().contains("oracle")){ + dataSource.setValidationQuery("select 1 from dual"); + }else { + dataSource.setValidationQuery("select 1 "); + if(static_driver.toLowerCase().contains("postgresql")) { + dataSource.setConnectionInitSqls(Collections.singletonList(searchPath)); + } + } + return dataSource; + } +} diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantThread.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantThread.java new file mode 100644 index 00000000..2bfb113d --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantThread.java @@ -0,0 +1,16 @@ +package com.supwisdom.dlpay.framework.tenant; + +/** + * Created by shuwei on 2018/11/29. + */ +public class TenantThread { + private static ThreadLocal tenant_schema = new ThreadLocal<>(); + + public static void setTenantSchema(String tid) { + tenant_schema.set(tid); + } + + public static String getTenantSchema() { + return tenant_schema.get(); + } +} diff --git a/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt index e1b58697..d401fa08 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt @@ -8,6 +8,7 @@ import com.supwisdom.dlpay.framework.core.JwtTokenUtil import com.supwisdom.dlpay.framework.domain.JwtRedis import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository +import com.supwisdom.dlpay.framework.util.Constants import com.supwisdom.dlpay.framework.util.DateUtil import com.supwisdom.dlpay.framework.util.TradeDict import com.supwisdom.dlpay.mobile.dao.MobileUserDao @@ -47,6 +48,7 @@ class AuthLoginSuccessHandler : SimpleUrlAuthenticationSuccessHandler() { val token = JwtTokenUtil(jwtConfig).generateToken( mapOf("uid" to user.uid, "issuer" to "payapi", "audience" to temp.phone, + Constants.JWT_CLAIM_TENANTID to "mobile", "authorities" to temp.authorities)) var jwt = JwtRedis().apply { jti = token.jti