优化 tenant 登录逻辑
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 5d0d601..0000000
--- 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 bf72bfe..0000000
--- 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 88f2121..4171906 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 @@
 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 @@
 
 @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 0000000..0ff2788
--- /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 0000000..fddcfd7
--- /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 0000000..b9038e2
--- /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 0000000..00d2cdd
--- /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 61c805f..9db3122 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.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 @@
             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 @@
             @Bean
             fun authenticationProvider(): DaoAuthenticationProvider {
                 return DaoAuthenticationProvider().apply {
-                    setUserDetailsService(userDetailsService)
+                    setUserDetailsService(multiTenantOperatorDetailService)
                     setPasswordEncoder(passwordEncoder())
                 }
             }