From 37a43a8234ddf20787c400bf85ffc790dfc3046b Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Thu, 2 Jan 2020 16:23:18 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=20tenant=20=E7=99=BB=E5=BD=95?= =?utf8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../MutliTenantDatasourceProviderAdapter.java | 21 ---------- .../service/OperatorDetailService.java | 6 --- ... => MultiTenantOperatorDetailService.java} | 23 ++++++----- .../tenant/AbstractTenantUserOperator.java | 5 +++ .../tenant/MultiTenantUserAdapter.java | 40 +++++++++++++++++++ .../tenant/StandaloneTenantUserAdapter.java | 13 ++++++ .../dlpay/framework/tenant/TenantUser.java | 30 ++++++++++++++ .../kotlin/com/supwisdom/dlpay/security.kt | 7 ++-- 8 files changed, 103 insertions(+), 42 deletions(-) delete mode 100644 payapi/src/main/java/com/supwisdom/dlpay/framework/core/MutliTenantDatasourceProviderAdapter.java delete mode 100644 payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java rename payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/{OperatorDetailServiceImpl.java => MultiTenantOperatorDetailService.java} (66%) create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/AbstractTenantUserOperator.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantUserAdapter.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/StandaloneTenantUserAdapter.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantUser.java diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/MutliTenantDatasourceProviderAdapter.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/MutliTenantDatasourceProviderAdapter.java deleted file mode 100644 index 5d0d6018..00000000 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/MutliTenantDatasourceProviderAdapter.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.supwisdom.dlpay.framework.core; - -import com.supwisdom.multitenant.datasource.MultiTenantDataSourceProvider; -import com.supwisdom.multitenant.datasource.MultiTenantDatasourceAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConditionalOnBean({MultiTenantDatasourceAutoConfiguration.class}) -public class MutliTenantDatasourceProviderAdapter implements DatabaseAdapter { - private final MultiTenantDataSourceProvider multiTenantDataSourceProvider; - - public MutliTenantDatasourceProviderAdapter(MultiTenantDataSourceProvider multiTenantDataSourceProvider) { - this.multiTenantDataSourceProvider = multiTenantDataSourceProvider; - } - - @Override - public String getDefaultSchema() { - return multiTenantDataSourceProvider.defaultSchema(); - } -} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java deleted file mode 100644 index bf72bfe0..00000000 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.supwisdom.dlpay.framework.service; - -import org.springframework.security.core.userdetails.UserDetailsService; - -public interface OperatorDetailService extends UserDetailsService { -} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/MultiTenantOperatorDetailService.java similarity index 66% rename from payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java rename to payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/MultiTenantOperatorDetailService.java index 88f2121d..41719060 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/MultiTenantOperatorDetailService.java @@ -3,14 +3,17 @@ package com.supwisdom.dlpay.framework.service.impl; import com.supwisdom.dlpay.framework.dao.OperRoleDao; import com.supwisdom.dlpay.framework.dao.OperatorDao; import com.supwisdom.dlpay.framework.domain.TOperator; -import com.supwisdom.dlpay.framework.service.OperatorDetailService; +import com.supwisdom.dlpay.framework.tenant.AbstractTenantUserOperator; +import com.supwisdom.dlpay.framework.tenant.TenantUser; +import com.supwisdom.dlpay.framework.util.Constants; import com.supwisdom.dlpay.framework.util.StringUtil; -import com.supwisdom.multitenant.TenantDetails; import com.supwisdom.multitenant.TenantSessionHelper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -24,24 +27,22 @@ import static org.apache.commons.lang3.StringUtils.substringBefore; @Slf4j @Service -public class OperatorDetailServiceImpl implements OperatorDetailService { +public class MultiTenantOperatorDetailService implements UserDetailsService { private final OperatorDao operatorDao; private final OperRoleDao operRoleDao; - private final TenantSessionHelper tenantSessionHelper; + private final AbstractTenantUserOperator tenantUserOperator; - public OperatorDetailServiceImpl(OperatorDao operatorDao, OperRoleDao operRoleDao, - TenantSessionHelper tenantSessionHelper) { + public MultiTenantOperatorDetailService(OperatorDao operatorDao, OperRoleDao operRoleDao, + AbstractTenantUserOperator tenantUserOperator) { this.operatorDao = operatorDao; this.operRoleDao = operRoleDao; - this.tenantSessionHelper = tenantSessionHelper; + this.tenantUserOperator = tenantUserOperator; } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - String domain = substringAfter(username, "@"); - tenantSessionHelper.setSessionTenantById(domain); - String realname = substringBefore(username, "@"); - TOperator oper = operatorDao.findByOpercode(realname); + TenantUser tenantUser = tenantUserOperator.tenantUsername(username); + TOperator oper = operatorDao.findByOpercode(tenantUser.getUsername()); if (null == oper) { throw new UsernameNotFoundException("管理员不存在"); } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/AbstractTenantUserOperator.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/AbstractTenantUserOperator.java new file mode 100644 index 00000000..0ff2788c --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/AbstractTenantUserOperator.java @@ -0,0 +1,5 @@ +package com.supwisdom.dlpay.framework.tenant; + +public interface AbstractTenantUserOperator { + public TenantUser tenantUsername(String username); +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantUserAdapter.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantUserAdapter.java new file mode 100644 index 00000000..fddcfd7d --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantUserAdapter.java @@ -0,0 +1,40 @@ +package com.supwisdom.dlpay.framework.tenant; + +import com.supwisdom.dlpay.framework.util.Constants; +import com.supwisdom.multitenant.TenantSessionHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.context.annotation.Primary; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; + +import static org.apache.commons.lang3.StringUtils.substringAfter; +import static org.apache.commons.lang3.StringUtils.substringBefore; + +@Component("multiTenantUserAdapter") +@Primary +@ConditionalOnBean(name = "multiTenantDatasourceAutoConfiguration") +public class MultiTenantUserAdapter implements AbstractTenantUserOperator { + private static final String DOMAIN_SEP = "@"; + + private TenantSessionHelper tenantSessionHelper; + + public MultiTenantUserAdapter(TenantSessionHelper tenantSessionHelper) { + this.tenantSessionHelper = tenantSessionHelper; + } + + @Override + public TenantUser tenantUsername(String username) { + String domain = substringAfter(username, DOMAIN_SEP); + String realname = substringBefore(username, DOMAIN_SEP); + if (StringUtils.isEmpty(domain)) { + tenantSessionHelper.setSessionTenantById(Constants.DEFAULT_TENANTID); + } else { + tenantSessionHelper.setSessionTenantById(domain); + } + if (StringUtils.isEmpty(realname)) { + throw new UsernameNotFoundException("管理员不存在"); + } + return new TenantUser(realname, domain); + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/StandaloneTenantUserAdapter.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/StandaloneTenantUserAdapter.java new file mode 100644 index 00000000..b9038e28 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/StandaloneTenantUserAdapter.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.framework.tenant; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Component; + +@Component("standaloneTenantUserAdapter") +@ConditionalOnMissingBean(name = "multiTenantDatasourceAutoConfiguration") +public class StandaloneTenantUserAdapter implements AbstractTenantUserOperator { + @Override + public TenantUser tenantUsername(String username) { + return new TenantUser(username, ""); + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantUser.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantUser.java new file mode 100644 index 00000000..00d2cddb --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantUser.java @@ -0,0 +1,30 @@ +package com.supwisdom.dlpay.framework.tenant; + +public class TenantUser { + private String username; + private String domain; + + public TenantUser(String username, String domain) { + this.username = username; + this.domain = domain; + } + + public TenantUser() { + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } +} diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt index 61c805ff..9db3122c 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt @@ -6,7 +6,7 @@ import com.supwisdom.dlpay.framework.core.PasswordBCryptConfig import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository import com.supwisdom.dlpay.framework.security.MyAuthenticationFailureHandler import com.supwisdom.dlpay.framework.security.ValidateCodeSecurityConfig -import com.supwisdom.dlpay.framework.service.OperatorDetailService +import com.supwisdom.dlpay.framework.service.impl.MultiTenantOperatorDetailService import com.supwisdom.dlpay.framework.util.Constants import com.supwisdom.dlpay.framework.util.TradeDict import com.supwisdom.dlpay.mobile.AuthLoginFailHandler @@ -337,9 +337,8 @@ class WebSecurityConfig { lateinit var authenticationFailureHandler: MyAuthenticationFailureHandler @Autowired lateinit var passwordBCryptConfig: PasswordBCryptConfig - @Autowired - lateinit var userDetailsService: OperatorDetailService + lateinit var multiTenantOperatorDetailService: MultiTenantOperatorDetailService override fun configure(auth: AuthenticationManagerBuilder) { auth.authenticationProvider(authenticationProvider()) @@ -348,7 +347,7 @@ class WebSecurityConfig { @Bean fun authenticationProvider(): DaoAuthenticationProvider { return DaoAuthenticationProvider().apply { - setUserDetailsService(userDetailsService) + setUserDetailsService(multiTenantOperatorDetailService) setPasswordEncoder(passwordEncoder()) } } -- 2.17.1