diff --git a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java b/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
deleted file mode 100644
index 6d71175..0000000
--- a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.supwisdom.infras.security.reactive.basic;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.HttpMethod;
-import org.springframework.security.config.web.server.ServerHttpSecurity;
-import org.springframework.security.web.server.SecurityWebFilterChain;
-
-@Configuration
-@ConditionalOnProperty(name="infras.security.basic.enabled", havingValue="true")
-public class BasicWebFluxSecurityConfiguration {
-  
-  @Bean
-  public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
-      http
-          .authorizeExchange()
-              .pathMatchers(HttpMethod.OPTIONS).permitAll()
-              .pathMatchers("/api/public/**", "/api/open/**").permitAll()
-              .pathMatchers("/api/v*/public/**", "/api/v*/open/**").permitAll()
-              .pathMatchers("/api/*/v*/public/**", "/api/*/v*/open/**").permitAll()
-              .pathMatchers("/api/**").authenticated()
-              .anyExchange().authenticated();
-      
-      http.httpBasic();
-      
-      http.csrf().disable();
-      
-      http.formLogin().disable();
-      
-      return http.build();
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java b/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
deleted file mode 100644
index 9658d27..0000000
--- a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.supwisdom.infras.security.reactive.basic;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.springframework.context.annotation.Import;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Import(BasicWebFluxSecurityConfiguration.class)
-public @interface EnableInfrasBasicWebFluxApi {
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java
index baaeade..a5098a6 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java
@@ -2,82 +2,41 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Bean;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.http.server.reactive.ServerHttpResponse;
-import org.springframework.web.cors.reactive.CorsUtils;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
 
-import reactor.core.publisher.Mono;
-
-import com.supwisdom.infras.security.reactive.basic.EnableInfrasBasicWebFluxApi;
+import com.supwisdom.infras.online.doc.configuration.EnableInfrasOnlineDoc;
+import com.supwisdom.institute.backend.common.core.transmit.annotation.EnableSimpleUserTransmit;
 import com.supwisdom.institute.backend.common.framework.exception.EnableCustomExceptionHandler;
 
-import static org.springframework.web.cors.CorsConfiguration.ALL;
-
 @SpringBootApplication
+@EnableFeignClients
 
+@EnableSimpleUserTransmit
 @EnableCustomExceptionHandler
 
-//@EnableInfrasOnlineDoc
-
-//@EnableInfrasCasSecurity
-
-//@EnableInfrasBasicApi
-//@EnableInfrasJWTApi
-
-@EnableInfrasBasicWebFluxApi
+@EnableInfrasOnlineDoc
 public class Application {
 
   public static void main(String[] args) {
     SpringApplication.run(Application.class, args);
   }
   
-//  @Bean
-//  public CorsFilter corsFilter() {
-//    final CorsConfiguration config = new CorsConfiguration();
-//    //config.setAllowCredentials(true);
-//    config.addAllowedOrigin("*");
-//    config.addAllowedHeader("*");
-//    config.addAllowedMethod("*");
-//
-//    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-//    source.registerCorsConfiguration("/v2/api-docs", config);
-//    source.registerCorsConfiguration("/api/**", config);  // 对 /api/** 下的请求，支持 cors 跨域请求，如不需要可以注释
-//
-//    return new CorsFilter(source);
-//  }
-
   @Bean
-  public WebFilter corsFilter() {
-    return (ServerWebExchange ctx, WebFilterChain chain) -> {
-      ServerHttpRequest request = ctx.getRequest();
-      if (!CorsUtils.isCorsRequest(request)) {
-        return chain.filter(ctx);
-      }
-      HttpHeaders requestHeaders = request.getHeaders();
-      ServerHttpResponse response = ctx.getResponse();
-      HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
-      HttpHeaders headers = response.getHeaders();
-      headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
-      headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders());
-      if (requestMethod != null) {
-        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
-      }
-      headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
-      headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, ALL);
-      // headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
-      if (request.getMethod() == HttpMethod.OPTIONS) {
-        response.setStatusCode(HttpStatus.OK);
-        return Mono.empty();
-      }
-      return chain.filter(ctx);
-    };
+  public CorsFilter corsFilter() {
+    final CorsConfiguration config = new CorsConfiguration();
+    // config.setAllowCredentials(true);
+    config.addAllowedOrigin("*");
+    config.addAllowedHeader("*");
+    config.addAllowedMethod("*");
+
+    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+    source.registerCorsConfiguration("/v2/api-docs", config);
+
+    return new CorsFilter(source);
   }
 
 }
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/.gitkeep
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/base/AdminBaseController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/base/AdminBaseController.java
new file mode 100644
index 0000000..62927da
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/base/AdminBaseController.java
@@ -0,0 +1,19 @@
+package com.supwisdom.institute.backend.admin.bff.apis.controller.base;
+
+import org.springframework.util.MimeTypeUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
+
+@RestController
+@RequestMapping(value = "/v1/admin/base")
+public class AdminBaseController {
+  
+  @RequestMapping(method = RequestMethod.GET, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  public String hello() {
+    return "hello, " + UserContext.getUsername();
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/biz/AdminBizController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/biz/AdminBizController.java
new file mode 100644
index 0000000..8ce27ec
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/biz/AdminBizController.java
@@ -0,0 +1,26 @@
+package com.supwisdom.institute.backend.admin.bff.apis.controller.biz;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.MimeTypeUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.supwisdom.institute.backend.admin.bff.apis.service.biz.BizService;
+
+@RestController
+@RequestMapping(value = "/api/bff/v1/admin/biz")
+public class AdminBizController {
+  
+  @Autowired
+  BizService bizService;
+
+  @RequestMapping(method = RequestMethod.GET, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  public String biz() {
+    
+    bizService.query(true, -1, -1);
+    
+    return "biz";
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/.gitkeep
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
new file mode 100644
index 0000000..f1d904e
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
@@ -0,0 +1,37 @@
+package com.supwisdom.institute.backend.admin.bff.apis.model.biz;
+
+import java.util.Date;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+public class Biz extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 8755876583168251137L;
+  
+  @Getter
+  @Setter
+  private String id;
+
+  @Getter
+  @Setter
+  private String name;
+  
+  @Getter
+  @Setter
+  private Boolean bool;
+  
+  @Getter
+  @Setter
+  private Date date;
+
+  @Getter
+  @Setter
+  private Integer num;
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/.gitkeep
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/configuration/BaseFeignClientConfiguration.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/configuration/BaseFeignClientConfiguration.java
new file mode 100644
index 0000000..3b327f5
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/configuration/BaseFeignClientConfiguration.java
@@ -0,0 +1,36 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.base.configuration;
+
+import org.apache.http.conn.HttpClientConnectionManager;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory;
+import org.springframework.context.annotation.Bean;
+
+import com.supwisdom.institute.backend.common.core.feign.FeignClientBuilder;
+
+import feign.Client;
+
+public class BaseFeignClientConfiguration {
+
+  @Bean
+  public Client feignClient(
+      @Value("${sw-backend-base-api.client-auth.enabled:false}") boolean enabled,
+      @Value("${sw-backend-base-api.client-auth.key-password:}") String keyPassword,
+      @Value("${sw-backend-base-api.client-auth.key-store:}") String keyStore,
+      @Value("${sw-backend-base-api.client-auth.key-store-password:}") String keyStorePassword,
+      @Value("${sw-backend-base-api.client-auth.trust-store:}") String trustStore,
+      @Value("${sw-backend-base-api.client-auth.trust-store-password:}") String trustStorePassword,
+      ApacheHttpClientFactory httpClientFactory,
+      HttpClientConnectionManager httpClientConnectionManager) {
+    
+    return FeignClientBuilder.builder()
+        .enabled(enabled)
+        .keyPassword(keyPassword)
+        .keyStore(keyStore)
+        .keyStorePassword(keyStorePassword)
+        .trustStore(trustStore)
+        .trustStorePassword(trustStorePassword)
+        .build()
+        .apacheHttpClient(httpClientFactory, httpClientConnectionManager);
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFallbackFactory.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFallbackFactory.java
new file mode 100644
index 0000000..1ff4981
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFallbackFactory.java
@@ -0,0 +1,14 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.base.v1.admin;
+
+import feign.hystrix.FallbackFactory;
+
+public class AdminAccountRemoteFallbackFactory implements FallbackFactory<AdminAccountRemoteFeignClient> {
+
+  @Override
+  public AdminAccountRemoteFeignClient create(Throwable cause) {
+    return new AdminAccountRemoteFeignClient() {
+      
+    };
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFeignClient.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFeignClient.java
new file mode 100644
index 0000000..99b04b8
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFeignClient.java
@@ -0,0 +1,15 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.base.v1.admin;
+
+import org.springframework.cloud.openfeign.FeignClient;
+
+import com.supwisdom.institute.backend.admin.bff.apis.remote.base.configuration.BaseFeignClientConfiguration;
+
+@FeignClient(
+    configuration = {BaseFeignClientConfiguration.class},
+    name = "base-admin-account-remote-feign-client",
+    url = "${sw-backend-base-api.uri}/v1/admin/accounts",
+    fallbackFactory = AdminAccountRemoteFallbackFactory.class
+)
+public interface AdminAccountRemoteFeignClient {
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/configuration/BizFeignClientConfiguration.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/configuration/BizFeignClientConfiguration.java
new file mode 100644
index 0000000..04d8547
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/configuration/BizFeignClientConfiguration.java
@@ -0,0 +1,36 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz.configuration;
+
+import org.apache.http.conn.HttpClientConnectionManager;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory;
+import org.springframework.context.annotation.Bean;
+
+import com.supwisdom.institute.backend.common.core.feign.FeignClientBuilder;
+
+import feign.Client;
+
+public class BizFeignClientConfiguration {
+
+  @Bean
+  public Client feignClient(
+      @Value("${sw-backend-biz-api.client-auth.enabled:false}") boolean enabled,
+      @Value("${sw-backend-biz-api.client-auth.key-password:}") String keyPassword,
+      @Value("${sw-backend-biz-api.client-auth.key-store:}") String keyStore,
+      @Value("${sw-backend-biz-api.client-auth.key-store-password:}") String keyStorePassword,
+      @Value("${sw-backend-biz-api.client-auth.trust-store:}") String trustStore,
+      @Value("${sw-backend-biz-api.client-auth.trust-store-password:}") String trustStorePassword,
+      ApacheHttpClientFactory httpClientFactory,
+      HttpClientConnectionManager httpClientConnectionManager) {
+    
+    return FeignClientBuilder.builder()
+      .enabled(enabled)
+      .keyPassword(keyPassword)
+      .keyStore(keyStore)
+      .keyStorePassword(keyStorePassword)
+      .trustStore(trustStore)
+      .trustStorePassword(trustStorePassword)
+      .build()
+      .apacheHttpClient(httpClientFactory, httpClientConnectionManager);
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFallbackFactory.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFallbackFactory.java
new file mode 100644
index 0000000..bd220ef
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFallbackFactory.java
@@ -0,0 +1,61 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz.v1.admin;
+
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+import com.supwisdom.institute.backend.admin.bff.apis.remote.exception.FallbackError;
+
+import feign.hystrix.FallbackFactory;
+
+@Component
+public class AdminBizRemoteFallbackFactory implements FallbackFactory<AdminBizRemoteFeignClient> {
+
+  @Override
+  public AdminBizRemoteFeignClient create(Throwable cause) {
+    return new AdminBizRemoteFeignClient() {
+
+      @Override
+      public JSONObject query(boolean loadAll, int pageIndex, int pageSize) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject load(String id) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject create(Biz biz) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject update(String id, Biz biz) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject delete(String id) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+      
+    };
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFeignClient.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFeignClient.java
new file mode 100644
index 0000000..a5628c1
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFeignClient.java
@@ -0,0 +1,51 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz.v1.admin;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+import com.supwisdom.institute.backend.admin.bff.apis.remote.biz.configuration.BizFeignClientConfiguration;
+
+@FeignClient(
+    configuration = {BizFeignClientConfiguration.class},
+    name = "biz-admin-biz-remote-feign-client",
+    url = "${sw-backend-biz-api.uri}/v1/admin/biz",
+    fallbackFactory = AdminBizRemoteFallbackFactory.class
+)
+public interface AdminBizRemoteFeignClient {
+  
+  @RequestMapping(method = RequestMethod.GET)
+  JSONObject query(
+      @RequestParam(name = "loadAll") boolean loadAll,
+      @RequestParam(name = "pageIndex") int pageIndex,
+      @RequestParam(name = "pageSize") int pageSize
+      
+  );
+  
+  @RequestMapping(method = RequestMethod.GET, path = "/{id}")
+  JSONObject load(
+      @PathVariable(name = "id") String id
+  );
+
+  @RequestMapping(method = RequestMethod.POST)
+  JSONObject create(
+      @RequestBody Biz biz
+  );
+
+  @RequestMapping(method = RequestMethod.PUT, path = "/{id}")
+  JSONObject update(
+      @PathVariable(name = "id") String id,
+      @RequestBody Biz biz
+  );
+  
+  @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
+  JSONObject delete(
+      @PathVariable(name = "id") String id
+  );
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/exception/FallbackError.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/exception/FallbackError.java
new file mode 100644
index 0000000..debd57d
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/exception/FallbackError.java
@@ -0,0 +1,21 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.exception;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class FallbackError {
+  
+  private FallbackError() {
+    
+  }
+  
+  public static JSONObject defaultErrorJson(Throwable cause) {
+    JSONObject error = new JSONObject();
+    
+    error.put("code", -1);
+    error.put("message", cause.getMessage());
+    error.put("error", cause.getMessage());
+    
+    return error;
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/.gitkeep
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
new file mode 100644
index 0000000..2ed6c10
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
@@ -0,0 +1,32 @@
+package com.supwisdom.institute.backend.admin.bff.apis.service.biz;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.remote.biz.v1.admin.AdminBizRemoteFeignClient;
+import com.supwisdom.institute.backend.admin.bff.apis.vo.biz.response.data.BizQueryResponseData;
+
+@Service
+public class BizService {
+  
+  @Autowired
+  private AdminBizRemoteFeignClient bizRemote;
+  
+  public BizQueryResponseData query(boolean loadAll, int pageIndex, int pageSize) {
+    
+    JSONObject jsonObject = bizRemote.query(loadAll, pageIndex, pageSize);
+    if (jsonObject == null) {
+      return null;
+    }
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.toJavaObject(BizQueryResponseData.class);
+    }
+    
+    return null;
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/.gitkeep
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/biz/response/data/BizQueryResponseData.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/biz/response/data/BizQueryResponseData.java
new file mode 100644
index 0000000..cc9c465
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/biz/response/data/BizQueryResponseData.java
@@ -0,0 +1,45 @@
+package com.supwisdom.institute.backend.admin.bff.apis.vo.biz.response.data;
+
+import java.util.List;
+import java.util.Map;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiQueryResponseData;
+
+public class BizQueryResponseData implements IApiQueryResponseData<Biz> {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -380945463584664943L;
+
+  @Getter
+  private boolean loadAll;
+  @Getter
+  private int pageIndex;
+  @Getter
+  private int pageSize;
+  @Getter
+  private Map<String, Object> mapBean;
+  @Getter
+  private Map<String, String> orderBy;
+  
+  @Getter
+  @Setter
+  private int pageCount;
+  @Getter
+  @Setter
+  private long recordCount;
+  
+  @Getter
+  @Setter
+  private int currentItemCount;
+  
+  @Getter
+  @Setter
+  private List<Biz> items;
+  
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/FeignBasicAuthRequestInterceptor.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/FeignBasicAuthRequestInterceptor.java
new file mode 100644
index 0000000..2a22b46
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/FeignBasicAuthRequestInterceptor.java
@@ -0,0 +1,77 @@
+package com.supwisdom.institute.backend.admin.bff.configuration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * feign请求参数转化
+ * @author fengpy
+ */
+@Configuration
+public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    public FeignBasicAuthRequestInterceptor() {}
+
+    @Override
+    public void apply(RequestTemplate template) {
+        ///**get-pojo贯穿*/
+        if (template.method().equals("GET") && template.request().body() != null) {
+            try {
+                JsonNode jsonNode = objectMapper.readTree(template.request().body());
+                //template.body(null);
+                Map<String, Collection<String>> queries = new HashMap<>();
+                //feign 不支持 GET 方法传 POJO, json body转query
+                buildQuery(jsonNode, "", queries);
+                template.queries(queries);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    //处理 get-pojo贯穿
+    private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) {
+        if (!jsonNode.isContainerNode()) { //叶子节点
+            if (jsonNode.isNull()) {
+                return;
+            }
+            Collection<String> values = queries.get(path);
+            if (null == values) {
+                values = new ArrayList<>();
+                queries.put(path, values);
+            }
+            values.add(jsonNode.asText());
+            return;
+        }
+        if (jsonNode.isArray()) { //数组节点
+            Iterator<JsonNode> it = jsonNode.elements();
+            while (it.hasNext()) {
+                buildQuery(it.next(), path, queries);
+            }
+        } else {
+            Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields();
+            while (it.hasNext()) {
+                Map.Entry<String, JsonNode> entry = it.next();
+                if (StringUtils.hasText(path)) {
+                    if ("mapBean".equals(path)||"orderBy".equals(path)||"sequence".equals(path)) {
+                        buildQuery(entry.getValue(), path + "[" + entry.getKey() + "]", queries);
+                    } else {
+                        buildQuery(entry.getValue(), path + "." + entry.getKey(), queries);
+                    }
+                } else { //根节点
+                    buildQuery(entry.getValue(), entry.getKey(), queries);
+                }
+            }
+        }
+    }
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GatewayFilterConfig.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GatewayFilterConfig.java
deleted file mode 100644
index 5084419..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GatewayFilterConfig.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.supwisdom.institute.backend.admin.bff.gateway.filter.factory.SimpleUserTransmitGatewayFilterFactory;
-
-@Deprecated
-//@Configuration
-public class GatewayFilterConfig {
-
-  @Bean
-  public SimpleUserTransmitGatewayFilterFactory simpleUserTransmitGatewayFilterFactory() {
-    return new SimpleUserTransmitGatewayFilterFactory();
-  }
-  
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GlobalFilterConfig.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GlobalFilterConfig.java
deleted file mode 100644
index e9e6282..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GlobalFilterConfig.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.supwisdom.institute.backend.admin.bff.gateway.filter.SimpleUserTransmitGlobalFilter;
-
-@Configuration
-public class GlobalFilterConfig {
-
-  @Bean
-  public SimpleUserTransmitGlobalFilter simpleUserTransmitGlobalFilter() {
-    return new SimpleUserTransmitGlobalFilter();
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/InfrasFilterSecurityInterceptorConfig.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/InfrasFilterSecurityInterceptorConfig.java
deleted file mode 100644
index 10410c9..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/InfrasFilterSecurityInterceptorConfig.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.access.AccessDecisionManager;
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-
-//import com.supwisdom.infras.security.web.access.intercept.InfrasFilterSecurityInterceptor;
-import com.supwisdom.institute.backend.admin.bff.security.web.access.MyAccessDecisionManager;
-import com.supwisdom.institute.backend.admin.bff.security.web.access.intercept.InMemeryFilterInvocationSecurityMetadataSource;
-//import com.supwisdom.institute.backend.admin.bff.security.web.access.intercept.MyFilterSecurityInterceptor;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Configuration
-public class InfrasFilterSecurityInterceptorConfig {
-
-//  @Bean
-//  public FilterInvocationSecurityMetadataSource securityMetadataSource() {
-//    MyFilterInvocationSecurityMetadataSource securityMetadataSource = new MyFilterInvocationSecurityMetadataSource();
-//    log.debug("InfrasFilterSecurityInterceptorConfig securityMetadataSource is {}", securityMetadataSource);
-//
-//    return securityMetadataSource;
-//  }
-  
-  @Bean
-  public FilterInvocationSecurityMetadataSource securityMetadataSource() {
-    InMemeryFilterInvocationSecurityMetadataSource securityMetadataSource = new InMemeryFilterInvocationSecurityMetadataSource();
-    log.debug("InfrasFilterSecurityInterceptorConfig securityMetadataSource is {}", securityMetadataSource);
-
-    return securityMetadataSource;
-  }
-  
-  
-  @Bean
-  public AccessDecisionManager accessDecisionManager() {
-    MyAccessDecisionManager accessDecisionManager = new MyAccessDecisionManager();
-    log.debug("InfrasFilterSecurityInterceptorConfig accessDecisionManager is {}", accessDecisionManager);
-
-    return accessDecisionManager;
-  }
-  
-//  @Bean
-//  public InfrasFilterSecurityInterceptor infrasFilterSecurityInterceptor() throws Exception {
-//    MyFilterSecurityInterceptor myFilterSecurityInterceptor = new MyFilterSecurityInterceptor();
-//    myFilterSecurityInterceptor.setRejectPublicInvocations(true);
-//    log.debug("InfrasFilterSecurityInterceptorConfig infrasFilterSecurityInterceptor is {}", myFilterSecurityInterceptor);
-//
-//    return myFilterSecurityInterceptor;
-//  }
-  
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/ListenerConfig.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/ListenerConfig.java
deleted file mode 100644
index 3f94d53..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/ListenerConfig.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-
-import com.supwisdom.institute.backend.admin.bff.listener.MyFilterInvocationSecurityMetadataSourceRefreshListener;
-
-@Configuration
-public class ListenerConfig {
-  
-  @Autowired
-  private FilterInvocationSecurityMetadataSource securityMetadataSource;
-  
-  @Bean
-  public ServletListenerRegistrationBean<MyFilterInvocationSecurityMetadataSourceRefreshListener> serssionListenerBean(){
-    MyFilterInvocationSecurityMetadataSourceRefreshListener listener = new MyFilterInvocationSecurityMetadataSourceRefreshListener();
-    listener.setSecurityMetadataSource(securityMetadataSource);
-    
-    ServletListenerRegistrationBean<MyFilterInvocationSecurityMetadataSourceRefreshListener> refreshListener = 
-        new ServletListenerRegistrationBean<MyFilterInvocationSecurityMetadataSourceRefreshListener>(listener);
-    return refreshListener;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/PasswordEncoderConfig.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/PasswordEncoderConfig.java
deleted file mode 100644
index b44d152..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/PasswordEncoderConfig.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.crypto.factory.PasswordEncoderFactories;
-import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
-import org.springframework.security.crypto.password.NoOpPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Configuration
-public class PasswordEncoderConfig {
-
-  @Bean
-  public PasswordEncoder passwordEncoder() {
-    
-    PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
-
-    if (passwordEncoder instanceof DelegatingPasswordEncoder) {
-      ((DelegatingPasswordEncoder)passwordEncoder).setDefaultPasswordEncoderForMatches(NoOpPasswordEncoder.getInstance());
-    }
-
-    log.debug("PasswordEncoderConfig passwordEncoder is {}", passwordEncoder);
-    return passwordEncoder;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java
index 9559532..1c8a23b 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java
@@ -1,32 +1,22 @@
 package com.supwisdom.institute.backend.admin.bff.configuration;
 
-import java.util.List;
-
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.AuthorizationScopeBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.AuthorizationScope;
-import springfox.documentation.service.BasicAuth;
 import springfox.documentation.service.Contact;
-import springfox.documentation.service.SecurityReference;
-import springfox.documentation.service.SecurityScheme;
 import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger.web.UiConfiguration;
 import springfox.documentation.swagger.web.UiConfigurationBuilder;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
-import static com.google.common.collect.Lists.*;
 
-
-//@Configuration
-//@EnableSwagger2
+@Configuration
+@EnableSwagger2
 public class Swagger2Config {
 
   @Value("${swagger2.apis.basePackage:com.supwisdom.institute}")
@@ -35,8 +25,6 @@
   @Bean
   public Docket createRestApi() {
     return new Docket(DocumentationType.SWAGGER_2)
-        .securitySchemes(securitySchemes())
-        .securityContexts(securityContexts())
         .apiInfo(apiInfo())
         .select()
         .apis(RequestHandlerSelectors.basePackage(basePackage))
@@ -46,36 +34,18 @@
   }
 
   private ApiInfo apiInfo() {
-    Contact contact = new Contact("Backend Admin BFF", "https://sw-backend-api.supwisdom.com/swagger-ui.html", ""); // name, url, email
+    Contact contact = new Contact("Backend Admin Aggregator API", "https://sw-backend-aggr.supwisdom.com/swagger-ui.html", ""); // name, url, email
     return new ApiInfoBuilder()
-        .title("Backend Admin BFF APIs")
-        .description("管理后台 - 后端接口")
+        .title("Backend Admin Aggregator APIs")
+        .description("管理后台 - 聚合接口")
         .termsOfServiceUrl("http://www.supwisdom.com/")
         .contact(contact)
         .version("1.0")
         .build();
   }
-  
-  private List<SecurityScheme> securitySchemes() {
-    return newArrayList(new BasicAuth("sample"));
-  }
-  
-  private List<SecurityContext> securityContexts() {
-    AuthorizationScope[] authScopes = new AuthorizationScope[1];
-    authScopes[0] = new AuthorizationScopeBuilder()
-            .scope("read")
-            .description("read access")
-            .build();
-    SecurityReference securityReference = SecurityReference.builder()
-            .reference("sample")
-            .scopes(authScopes)
-            .build();
-    
-    return newArrayList(SecurityContext.builder().securityReferences(newArrayList(securityReference)).build());
-  }
 
   @Bean
-  public UiConfiguration uiConfig() {
+  UiConfiguration uiConfig() {
     
     return UiConfigurationBuilder.builder().build();
     
@@ -89,26 +59,5 @@
 //        60000L); // requestTimeout => in milliseconds, defaults to null
 //    // (uses jquery xh timeout)
   }
-  
-  
-//  @Bean
-//  public SecurityConfiguration oauth2() {
-//      return SecurityConfigurationBuilder.builder()
-//          .clientId("common")
-//          .clientSecret("secret")
-//          .scopeSeparator(" ")
-//          .useBasicAuthenticationWithAccessCodeGrant(true)
-//          .build();
-//  }
-//  
-//  @Bean
-//  public SecurityConfiguration basic() {
-//      return SecurityConfigurationBuilder.builder()
-//          .clientId("common")
-//          .clientSecret("secret")
-//          .scopeSeparator(" ")
-//          .useBasicAuthenticationWithAccessCodeGrant(true)
-//          .build();
-//  }
 
 }
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/UserDetailsServiceConfig.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/UserDetailsServiceConfig.java
deleted file mode 100644
index 63945f4..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/UserDetailsServiceConfig.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.supwisdom.institute.backend.admin.bff.security.core.userdetails.InMemeryUserDetailsService;
-import com.supwisdom.institute.backend.admin.bff.security.core.userdetails.MyUserDetailsService;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Configuration
-public class UserDetailsServiceConfig {
-
-//  @Bean
-//  public MyUserDetailsService userDetailsService() throws Exception {
-//    MyUserDetailsService myUserDetailsService = new MyUserDetailsService();
-//    log.debug("UserDetailsServiceConfig myUserDetailsService is {}", myUserDetailsService);
-//
-//    return myUserDetailsService;
-//  }
-
-  @Bean
-  public InMemeryUserDetailsService userDetailsService() throws Exception {
-    InMemeryUserDetailsService inMemeryUserDetailsService = new InMemeryUserDetailsService();
-    log.debug("UserDetailsServiceConfig inMemeryUserDetailsService is {}", inMemeryUserDetailsService);
-
-    return inMemeryUserDetailsService;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/SimpleUserTransmitGlobalFilter.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/SimpleUserTransmitGlobalFilter.java
deleted file mode 100644
index a9bf2ae..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/SimpleUserTransmitGlobalFilter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.gateway.filter;
-
-import java.net.URLDecoder;
-
-import lombok.extern.slf4j.Slf4j;
-
-import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-import org.springframework.cloud.gateway.filter.GlobalFilter;
-import org.springframework.core.Ordered;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.ReactiveSecurityContextHolder;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.web.server.ServerWebExchange;
-
-import com.alibaba.fastjson.JSONObject;
-import com.supwisdom.institute.backend.admin.bff.security.core.userdetails.MyUser;
-import com.supwisdom.institute.backend.common.core.transmit.user.User;
-import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
-
-import reactor.core.publisher.Mono;
-
-@Slf4j
-public class SimpleUserTransmitGlobalFilter implements GlobalFilter, Ordered {
-
-  @Override
-  public int getOrder() {
-    return 0;
-  }
-
-  @Override
-  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-    
-    return ReactiveSecurityContextHolder.getContext()
-      .filter(c -> c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof MyUser)
-      .map(SecurityContext::getAuthentication)
-      .map(Authentication::getPrincipal)
-      .cast(MyUser.class)
-      .map(myUser -> {
-        try {
-          User user = new User(myUser.getUsername(), myUser.getRoles(), myUser.getAttributes());
-          
-          String jsonUser = JSONObject.toJSONString(user);
-          log.info(jsonUser);
-          String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
-          ServerHttpRequest request = exchange.getRequest().mutate()
-              .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
-              .build();
-          log.debug("User set ok");
-          return exchange.mutate().request(request).build();
-        } catch (Exception e) {
-          log.warn("User set error", e);
-        }
-        return exchange;
-      })
-      .flatMap(ex -> chain.filter(ex))
-    ;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/factory/SimpleUserTransmitGatewayFilterFactory.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/factory/SimpleUserTransmitGatewayFilterFactory.java
deleted file mode 100644
index 68b6ad3..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/factory/SimpleUserTransmitGatewayFilterFactory.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.gateway.filter.factory;
-
-import java.net.URLDecoder;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
-
-import org.springframework.cloud.gateway.filter.GatewayFilter;
-import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.ReactiveSecurityContextHolder;
-import org.springframework.security.core.context.SecurityContext;
-
-import com.alibaba.fastjson.JSONObject;
-import com.supwisdom.institute.backend.admin.bff.security.core.userdetails.MyUser;
-import com.supwisdom.institute.backend.common.core.transmit.user.User;
-import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
-
-@Deprecated
-@Slf4j
-public class SimpleUserTransmitGatewayFilterFactory extends AbstractGatewayFilterFactory<SimpleUserTransmitGatewayFilterFactory.Config> {
-  
-  public SimpleUserTransmitGatewayFilterFactory() {
-    super(Config.class);
-  }
-
-  @Override
-  public GatewayFilter apply(Config config) {
-    return (exchange, chain) -> {
-      
-      
-//      Mono<ServerWebExchange> m = Mono.fromCallable(() ->{
-//        MyUser myUser = ReactiveSecurityContextHolder.getContext()
-//            .filter(c -> c.getAuthentication() != null)
-//            .map(SecurityContext::getAuthentication)
-//            .map(Authentication::getPrincipal)
-//            .cast(MyUser.class)
-//            .block()
-//          ;
-//          try {
-//            String jsonUser = JSONObject.toJSONString(myUser);
-//            log.info(jsonUser);
-//            String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
-//            ServerHttpRequest request = exchange.getRequest().mutate()
-//                .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
-//                .build();
-//            log.debug("User set ok");
-//            return exchange.mutate().request(request).build();
-//          } catch (Exception e) {
-//            log.warn("User set error", e);
-//          }
-//          return exchange;
-//      })
-//      .publishOn(Schedulers.elastic())
-//      ;
-//      return m.flatMap(ex -> chain.filter(ex));
-
-      
-      return ReactiveSecurityContextHolder.getContext()
-          .filter(c -> c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof MyUser)
-          .map(SecurityContext::getAuthentication)
-          .map(Authentication::getPrincipal)
-          .cast(MyUser.class)
-          .map(myUser -> {
-            try {
-              User user = new User(myUser.getUsername(), myUser.getRoles(), myUser.getAttributes());
-              
-              String jsonUser = JSONObject.toJSONString(user);
-              log.info(jsonUser);
-              String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
-              ServerHttpRequest request = exchange.getRequest().mutate()
-                  .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
-                  .build();
-              log.debug("User set ok");
-              return exchange.mutate().request(request).build();
-            } catch (Exception e) {
-              log.warn("User set error", e);
-            }
-            return exchange;
-          })
-          .flatMap(ex -> chain.filter(ex))
-        ;
-    };
-  }
-
-  public static class Config {
-    @Getter
-    @Setter
-    private String a;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/route/CustomRouteLocator.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/route/CustomRouteLocator.java
deleted file mode 100644
index fc90c15..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/route/CustomRouteLocator.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.gateway.route;
-
-import org.springframework.cloud.gateway.route.Route;
-import org.springframework.cloud.gateway.route.RouteLocator;
-
-import reactor.core.publisher.Flux;
-
-public class CustomRouteLocator implements RouteLocator {
-
-  @Override
-  public Flux<Route> getRoutes() {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/listener/MyFilterInvocationSecurityMetadataSourceRefreshListener.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/listener/MyFilterInvocationSecurityMetadataSourceRefreshListener.java
deleted file mode 100644
index 2c6d2bd..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/listener/MyFilterInvocationSecurityMetadataSourceRefreshListener.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.listener;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import javax.servlet.ServletContextEvent;
-
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-import org.springframework.web.context.ContextLoaderListener;
-
-import com.supwisdom.institute.backend.admin.bff.security.web.access.intercept.MyFilterInvocationSecurityMetadataSource;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class MyFilterInvocationSecurityMetadataSourceRefreshListener extends ContextLoaderListener {
-
-  private FilterInvocationSecurityMetadataSource securityMetadataSource;
-  public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource securityMetadataSource) {
-    this.securityMetadataSource = securityMetadataSource;
-  }
-
-  private Timer timer = null;
-
-  private int delay = 1; // 启动后，延迟1分钟
-  private int period = 2; // 定时，每隔2分钟
-
-  @Override
-  public void contextInitialized(ServletContextEvent event) {
-    // super.contextInitialized(event);
-    log.info("MyFilterInvocationSecurityMetadataSourceRefreshListener.contextInitialized");
-
-    if (securityMetadataSource instanceof MyFilterInvocationSecurityMetadataSource) {
-      timer = new Timer("定时刷新权限信息", true);
-
-      timer.scheduleAtFixedRate(new TimerTask() {
-
-        @Override
-        public void run() {
-          ((MyFilterInvocationSecurityMetadataSource) securityMetadataSource).refreshRequestMap();
-        }
-
-      }, 1000 * 60 * delay, 1000 * 60 * period);
-
-    }
-
-  }
-
-  @Override
-  public void contextDestroyed(ServletContextEvent event) {
-    // super.contextDestroyed(event);
-    log.info("MyFilterInvocationSecurityMetadataSourceRefreshListener.contextDestroyed");
-
-    if (timer != null) {
-      timer.cancel();
-    }
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/InMemeryUserDetailsService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/InMemeryUserDetailsService.java
deleted file mode 100644
index bfe9a21..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/InMemeryUserDetailsService.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.security.core.userdetails;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-import com.supwisdom.institute.backend.common.core.transmit.user.User;
-import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
-
-import reactor.core.publisher.Mono;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class InMemeryUserDetailsService implements UserDetailsService, ReactiveUserDetailsService {
-
-  @Autowired
-  PasswordEncoder passwordEncoder;
-  
-  @Override
-  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-    
-    log.debug("InMemeryUserDetailsService.loadUserByUsername({})", username);
-    
-    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
-    authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-    authorities.add(new SimpleGrantedAuthority("administrator"));
-    authorities.add(new SimpleGrantedAuthority("user"));
-
-    Map<String, Object> attributes = new HashMap<String, Object>();
-    
-    MyUser myUser = new MyUser(username, passwordEncoder.encode(username), authorities, attributes);
-    log.debug("myUser is {}", myUser);
-    
-    return myUser;
-  }
-
-  @Override
-  public Mono<UserDetails> findByUsername(String username) {
-
-    log.debug("InMemeryUserDetailsService.findByUsername({})", username);
-    
-    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
-    authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-    authorities.add(new SimpleGrantedAuthority("administrator"));
-    authorities.add(new SimpleGrantedAuthority("user"));
-
-    Map<String, Object> attributes = new HashMap<String, Object>();
-    
-    MyUser myUser = new MyUser(username, passwordEncoder.encode(username), authorities, attributes);
-    log.debug("myUser is {}", myUser);
-    
-    List<String> roles = new ArrayList<>();
-    roles.add("ROLE_ADMIN");
-    roles.add("administrator");
-    roles.add("user");
-    User user = new User(username, roles, attributes);
-    UserContext.setUser(user);
-    
-    return Mono.just(myUser);
-  }
-  
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUser.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUser.java
deleted file mode 100644
index b662422..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUser.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.security.core.userdetails;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.userdetails.User;
-
-public class MyUser extends User {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 3195151947212484499L;
-
-  public MyUser(String username, String password, 
-      Collection<? extends GrantedAuthority> authorities, 
-      Map<String, Object> attributes) {
-    this(username, password, true, true, true, true, authorities, attributes);
-  }
-
-  public MyUser(String username, String password, 
-      boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, 
-      Collection<? extends GrantedAuthority> authorities, 
-      Map<String, Object> attributes) {
-    super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
-    
-    this.attributes = attributes;
-  }
-
-  private final Map<String, Object> attributes;
-  public Map<String, Object> getAttributes() {
-    return this.attributes;
-  }
-  
-  public List<String> getRoles() {
-    List<String> roles = new ArrayList<>();
-    for (GrantedAuthority grantedAuthority : this.getAuthorities()) {
-      roles.add(grantedAuthority.getAuthority());
-    }
-    
-    return roles;
-  }
-  
-
-  public Object getAttribute(String key) {
-    if (attributes == null) {
-      return null;
-    }
-    
-    if (!attributes.containsKey(key)) {
-      return null;
-    }
-    
-    return attributes.get(key);
-  }
-  
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUserDetailsService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUserDetailsService.java
deleted file mode 100644
index 110af6b..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUserDetailsService.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.security.core.userdetails;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-import reactor.core.publisher.Mono;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class MyUserDetailsService implements UserDetailsService, ReactiveUserDetailsService {
-  
-  @Autowired
-  PasswordEncoder passwordEncoder;
-
-//  @Autowired
-//  AccountService accountService;
-  
-  @Override
-  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // TODO: 
-
-    log.debug("MyUserDetailsService.loadUserByUsername({})", username);
-    
-//    Account account = accountService.loadByUsername(username);
-//    if (account == null) {
-//      throw new UsernameNotFoundException(String.format("%s not found", username));
-//    }
-//    
-//    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
-////    for (Role role : securityUser.getRoles()) {
-////      authorities.add(new SimpleGrantedAuthority(role.getCode()));
-////    }
-//    // FIXME: 
-//    authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-//    authorities.add(new SimpleGrantedAuthority("administrator"));
-//    authorities.add(new SimpleGrantedAuthority("user"));
-//    
-//    Map<String, Object> attributes = new HashMap<String, Object>();
-//    attributes.put("userId", account.getUser().getId());
-//    attributes.put("userUid", account.getUser().getUid());
-//    
-//    MyUser myUser = new MyUser(
-//        account.getAccountName(), 
-//        account.getUser().getPassWord(), 
-//        account.getActivation() && "Normal".equals(account.getState()) ? true : false, 
-//        account.getAccountExpiryDate() == null || Calendar.getInstance().getTime().before(account.getAccountExpiryDate()) ? true : false,
-//        true, 
-//        true, 
-//        authorities,
-//        attributes);
-//    
-//    log.debug("myUser is {}", myUser);
-    
-    MyUser myUser = null;
-    
-    return myUser;
-  }
-
-  @Override
-  public Mono<UserDetails> findByUsername(String username) {
-    log.debug("MyUserDetailsService.findByUsername({})", username);
-    
-    MyUser myUser = null;
-    
-    return Mono.just(myUser);
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/MyAccessDecisionManager.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/MyAccessDecisionManager.java
deleted file mode 100644
index 56fe469..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/MyAccessDecisionManager.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.security.web.access;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.springframework.security.access.AccessDecisionManager;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.authentication.InsufficientAuthenticationException;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-
-public class MyAccessDecisionManager implements AccessDecisionManager {
-
-  @Override
-  public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
-      throws AccessDeniedException, InsufficientAuthenticationException {
-
-    if (null == configAttributes || configAttributes.size() <= 0) {
-      return;
-    }
-    
-    ConfigAttribute ca;
-    String needRole;
-    for (Iterator<ConfigAttribute> iter = configAttributes.iterator(); iter.hasNext();) {
-      ca = iter.next();
-      needRole = ca.getAttribute();
-      for (GrantedAuthority ga : authentication.getAuthorities()) { // authentication 为在注释1 中循环添加到 GrantedAuthority 对象中的权限信息集合
-        if (needRole.trim().equals(ga.getAuthority())) {
-          return;
-        }
-      }
-    }
-    
-    throw new AccessDeniedException("no right");
-  }
-
-  @Override
-  public boolean supports(ConfigAttribute attribute) {
-    return true;
-  }
-
-  @Override
-  public boolean supports(Class<?> clazz) {
-    return true;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/intercept/InMemeryFilterInvocationSecurityMetadataSource.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/intercept/InMemeryFilterInvocationSecurityMetadataSource.java
deleted file mode 100644
index 5666b1a..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/intercept/InMemeryFilterInvocationSecurityMetadataSource.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.security.web.access.intercept;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.access.SecurityConfig;
-import org.springframework.security.web.FilterInvocation;
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-import org.springframework.security.web.util.matcher.RequestMatcher;
-
-public class InMemeryFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
-  
-  private Map<RequestMatcher, Collection<ConfigAttribute>> requestMap = null;
-  
-  private void loadRequestMap() {
-    if (requestMap == null) {
-      requestMap = new LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>();
-      
-      AntPathRequestMatcher requestMatcher0 = new AntPathRequestMatcher("/api/**");
-      Collection<ConfigAttribute> attributes0 = new ArrayList<ConfigAttribute>();  // FIXME: 返回当前请求的url 对应的 角色代码
-      attributes0.add(new SecurityConfig("user"));
-      requestMap.put(requestMatcher0, attributes0);
-
-      
-      AntPathRequestMatcher requestMatcher = new AntPathRequestMatcher("/web/**");
-      Collection<ConfigAttribute> attributes = new ArrayList<ConfigAttribute>();  // FIXME: 返回当前请求的url 对应的 角色代码
-      attributes.add(new SecurityConfig("user"));
-      requestMap.put(requestMatcher, attributes);
-    }
-  }
-
-  /**
-   * 获取当前请求关联的所有角色code {@link SecurityConfig} 
-   * 用于和用户拥有的角色code 进行比对
-   */
-  @Override
-  public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
-    
-    if (requestMap == null) {
-      loadRequestMap();
-    }
-
-    HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
-    
-    RequestMatcher requestMatcher;
-    for(Iterator<RequestMatcher> iter = requestMap.keySet().iterator(); iter.hasNext(); ) {
-      requestMatcher = iter.next();
-      
-      if(requestMatcher.matches(request)) {
-        return requestMap.get(requestMatcher);
-      }
-    }
-    
-    return null;
-  }
-
-  @Override
-  public Collection<ConfigAttribute> getAllConfigAttributes() {
-
-    return null;
-  }
-
-  @Override
-  public boolean supports(Class<?> clazz) {
-
-    return true;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/intercept/MyFilterInvocationSecurityMetadataSource.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/intercept/MyFilterInvocationSecurityMetadataSource.java
deleted file mode 100644
index 90f4b53..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/web/access/intercept/MyFilterInvocationSecurityMetadataSource.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.security.web.access.intercept;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.access.SecurityConfig;
-import org.springframework.security.web.FilterInvocation;
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-import org.springframework.security.web.util.matcher.RequestMatcher;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
-  
-//  @Autowired
-//  User1SecurityPermissionRemoteService user1SecurityPermissionRemoteService;
-
-  private Map<RequestMatcher, Collection<ConfigAttribute>> requestMap = null;
-
-  public void refreshRequestMap() {
-    
-    log.info("MyFilterInvocationSecurityMetadataSource.refreshRequestMap");
-    
-    requestMap = null;
-    loadRequestMap();
-  }
-  
-  private void loadRequestMap() {
-    synchronized (MyFilterInvocationSecurityMetadataSource.class) {
-
-      if (requestMap == null) {
-        requestMap = new LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>();
-        
-//        String applicationCode = Constants.APPLICATION_CODE;
-//        SecurityPermission securityPermission = user1SecurityPermissionRemoteService.loadPermissionsByAppcode(applicationCode, null);
-//        if (securityPermission == null) {
-//          return;
-//        }
-//  
-//        Map<String, String> mapRoles = new HashMap<String, String>();
-//        for (Role r : securityPermission.getRoles()) {
-//          mapRoles.put(r.getId(), r.getCode());
-//        }
-//  
-//        Map<String, Collection<ConfigAttribute>> permissionRoles = new HashMap<String, Collection<ConfigAttribute>>();
-//        for (RolePermission rp : securityPermission.getRolePermissions()) {
-//          if (mapRoles.containsKey(rp.getRoleId())) {
-//            if (!permissionRoles.containsKey(rp.getPermissionId())) {
-//              permissionRoles.put(rp.getPermissionId(), new ArrayList<ConfigAttribute>());
-//            }
-//            ConfigAttribute ca = new SecurityConfig(mapRoles.get(rp.getRoleId()));
-//            permissionRoles.get(rp.getPermissionId()).add(ca);
-//          }
-//        }
-//  
-//        for (Permission p : securityPermission.getPermissions()) {
-//          Collection<ConfigAttribute> attributes = permissionRoles.get(p.getId());
-//          if (attributes == null) {
-//            attributes = new ArrayList<ConfigAttribute>();
-//          }
-//          
-//          if (p.getUrl() == null || p.getUrl().isEmpty()) {
-//            continue;
-//          }
-//          
-//          String pattern = p.getUrl();
-//          String httpMethod = null;
-//          
-//          if (pattern.startsWith("GET ") || pattern.startsWith("POST ") || pattern.startsWith("PUT ") || pattern.startsWith("DELETE ")) {
-//            httpMethod = pattern.substring(0, pattern.indexOf(" "));
-//            pattern = pattern.substring(pattern.indexOf(" ")+1);
-//          }
-//          
-//          AntPathRequestMatcher requestMatcher = new AntPathRequestMatcher(pattern, httpMethod);
-//  
-//          requestMap.put(requestMatcher, attributes);
-//        }
-      }
-      
-    }
-  }
-
-  /**
-   * 获取当前请求关联的所有角色code {@link SecurityConfig} 用于和用户拥有的角色code 进行比对
-   */
-  @Override
-  public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
-
-    if (requestMap == null) {
-      loadRequestMap();
-    }
-
-    HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
-
-    RequestMatcher requestMatcher;
-    for (Iterator<RequestMatcher> iter = requestMap.keySet().iterator(); iter.hasNext();) {
-      requestMatcher = iter.next();
-
-      if (requestMatcher.matches(request)) {
-        return requestMap.get(requestMatcher);
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public Collection<ConfigAttribute> getAllConfigAttributes() {
-
-    return null;
-  }
-
-  @Override
-  public boolean supports(Class<?> clazz) {
-
-    return true;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/utils/AuthenticationUtil.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/utils/AuthenticationUtil.java
deleted file mode 100644
index b2ab8e8..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/utils/AuthenticationUtil.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.utils;
-
-import java.util.Collection;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import com.supwisdom.institute.backend.admin.bff.security.core.userdetails.MyUser;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class AuthenticationUtil {
-
-  public static String currentUsername() {
-
-    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-    if (authentication == null) {
-      log.error("authentication is null");
-      return null;
-    }
-
-    log.debug("authentication is {}", authentication.getPrincipal());
-
-    if (!authentication.isAuthenticated()) {
-      log.error("authentication is not authenticated");
-      return null;
-    }
-
-    if (authentication.getPrincipal() == null) {
-      log.error("authentication's principal is null");
-      return null;
-    }
-
-    log.debug("authentication's principal is {}", authentication.getPrincipal());
-
-    if (authentication.getPrincipal() instanceof MyUser) {
-      return ((MyUser) authentication.getPrincipal()).getUsername();
-    }
-
-    return null;
-  }
-
-  public static MyUser currentUser() {
-
-    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-    if (authentication == null) {
-      log.error("authentication is null");
-      return null;
-    }
-
-    log.debug("authentication is {}", authentication.getPrincipal());
-
-    if (!authentication.isAuthenticated()) {
-      log.error("authentication is not authenticated");
-      return null;
-    }
-
-    if (authentication.getPrincipal() == null) {
-      log.error("authentication's principal is null");
-      return null;
-    }
-
-    log.debug("authentication's principal is {}", authentication.getPrincipal());
-
-    if (authentication.getPrincipal() instanceof MyUser) {
-      return (MyUser) authentication.getPrincipal();
-    }
-
-    return null;
-  }
-
-  public static boolean isAdministrator() {
-    MyUser myUser = AuthenticationUtil.currentUser();
-    if (myUser != null) {
-      Collection<GrantedAuthority> grantedAuthoritys = myUser.getAuthorities();
-      if (grantedAuthoritys != null && grantedAuthoritys.size() > 0) {
-        for (GrantedAuthority grantedAuthority : grantedAuthoritys) {
-          if ("administrator".equals(grantedAuthority.getAuthority())) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-
-}
diff --git a/bff/admin/src/main/resources/application-docker.yml b/bff/admin/src/main/resources/application-docker.yml
index 9fb465a..78c8a3d 100644
--- a/bff/admin/src/main/resources/application-docker.yml
+++ b/bff/admin/src/main/resources/application-docker.yml
@@ -33,41 +33,7 @@
 
 
 ##
-# spring cloud gateway
-#
-  cloud:
-    gateway:
-      metrics:
-        enabled: true
-      routes:
-      - id: aggr-api
-        uri: ${SW_BACKEND_AGGR_API_URI:https://sw-backend-admin-aggr}
-        predicates:
-        - Path=/api/aggr/**
-        filters:
-        - RewritePath=/api/aggr/(?<suffix>.*), /$\{suffix}
-      - id: base-api
-        uri: ${SW_BACKEND_BASE_API_URI:https://sw-backend-admin-sa}
-        predicates:
-        - Path=/api/base/**
-        filters:
-        - RewritePath=/api/base/(?<suffix>.*), /$\{suffix}
-      - id: system-api
-        uri: ${SW_BACKEND_SYSTEM_API_URI:https://sw-backend-admin-sa}
-        predicates:
-        - Path=/api/system/**
-        filters:
-        - RewritePath=/api/system/(?<suffix>.*), /$\{suffix}
-      - id: biz-api
-        uri: ${SW_BACKEND_BIZ_API_URI:https://sw-backend-admin-sa}
-        predicates:
-        - Path=/api/biz/**
-        filters:
-        - RewritePath=/api/biz/(?<suffix>.*), /$\{suffix}
-
-
-##
-# infras.online-doc
+# online-doc
 #
 infras.online-doc.enabled: ${INFRAS_ONLINE_DOC_ENABLED:false}
 infras.online-doc.md-docs.staitc.path: ${INFRAS_ONLINE_DOC_MD_DOCS_STATIC_PATH:/doc/}
@@ -75,31 +41,34 @@
 
 
 ##
-# infras.security basic
+# server url for feign
 #
-infras.security.basic.enabled: ${INFRAS_SECURITY_BASIC_ENABLED:true}
+sw-backend-base-api: 
+  uri: ${SW_BACKEND_BASE_API_URI:https://sw-backend-admin-sa}
+  client-auth:
+    enabled: ${SW_BACKEND_BASE_API_CLIENT_AUTH_ENABLED:true}
+    key-password: ${SW_BACKEND_BASE_API_CLIENT_AUTH_KEY_PASSWORD:}
+    key-store: ${SW_BACKEND_BASE_API_CLIENT_AUTH_KEYSTORE_FILE:file:/certs/common/common.keystore}
+    key-store-password: ${SW_BACKEND_BASE_API_CLIENT_AUTH_KEYSTORE_PASSWORD:}
+    trust-store: ${SW_BACKEND_BASE_API_CLIENT_AUTH_TRUSTSTORE_FILE:file:/certs/common/common.truststore}
+    trust-store-password: ${SW_BACKEND_BASE_API_CLIENT_AUTH_TRUSTSTORE_PASSWORD:}
 
+sw-backend-system-api: 
+  uri: ${SW_BACKEND_SYSTEM_API_URI:https://sw-backend-admin-sa}
+  client-auth:
+    enabled: ${SW_BACKEND_SYSTEM_API_CLIENT_AUTH_ENABLED:true}
+    key-password: ${SW_BACKEND_SYSTEM_API_CLIENT_AUTH_KEY_PASSWORD:}
+    key-store: ${SW_BACKEND_SYSTEM_API_CLIENT_AUTH_KEYSTORE_FILE:file:/certs/common/common.keystore}
+    key-store-password: ${SW_BACKEND_SYSTEM_API_CLIENT_AUTH_KEYSTORE_PASSWORD:}
+    trust-store: ${SW_BACKEND_SYSTEM_API_CLIENT_AUTH_TRUSTSTORE_FILE:file:/certs/common/common.truststore}
+    trust-store-password: ${SW_BACKEND_SYSTEM_API_CLIENT_AUTH_TRUSTSTORE_PASSWORD:}
 
-##
-# infras.security jwt
-#
-infras.security.jwt.enabled: ${INFRAS_SECURITY_JWT_ENABLED:false}
-
-infras.security.jwt.public-key-pem: ${INFRAS_SECURITY_JWT_PUBLIC_KEY_PEM:}
-infras.security.jwt.private-key-pem-pkcs8: ${INFRAS_SECURITY_JWT_PRIVATE_KEY_PEM_PKCS8:}
-
-
-##
-# infras.security cas
-#
-infras.security.cas.enabled: ${INFRAS_SECURITY_CAS_ENABLED:false}
-
-#应用访问地址
-app.server.host.url: ${APP_SERVER_HOST_URL:https://localhost:8443}
-#应用登录地址
-app.login.url: ${APP_LOGIN_URL:/cas/login}
-#应用登出地址
-app.logout.url: ${APP_LOGOUT_URL:/cas/logout}
-
-#CAS服务地址
-cas.server.host.url: ${CAS_SERVER_HOST_URL:https://cas-server/cas}
+sw-backend-biz-api: 
+  uri: ${SW_BACKEND_BIZ_API_URI:https://sw-backend-admin-sa}
+  client-auth:
+    enabled: ${SW_BACKEND_BIZ_API_CLIENT_AUTH_ENABLED:true}
+    key-password: ${SW_BACKEND_BIZ_API_CLIENT_AUTH_KEY_PASSWORD:}
+    key-store: ${SW_BACKEND_BIZ_API_CLIENT_AUTH_KEYSTORE_FILE:file:/certs/common/common.keystore}
+    key-store-password: ${SW_BACKEND_BIZ_API_CLIENT_AUTH_KEYSTORE_PASSWORD:}
+    trust-store: ${SW_BACKEND_BIZ_API_CLIENT_AUTH_TRUSTSTORE_FILE:file:/certs/common/common.truststore}
+    trust-store-password: ${SW_BACKEND_BIZ_API_CLIENT_AUTH_TRUSTSTORE_PASSWORD:}
diff --git a/bff/admin/src/main/resources/application.yml b/bff/admin/src/main/resources/application.yml
index 5893a41..8ad7215 100644
--- a/bff/admin/src/main/resources/application.yml
+++ b/bff/admin/src/main/resources/application.yml
@@ -1,5 +1,7 @@
 server:
-  port: 8080
+  port: 8081
+  ssl:
+    enabled: false
 
 
 ##
@@ -13,84 +15,54 @@
 #    org.springframework.cloud.openfeign: INFO
 
 
+swagger2.apis.basePackage: com.supwisdom.institute
+
+
 spring:
   jackson:
     time-zone: Asia/Shanghai
 
-##
-# spring cloud gateway
-#
-  cloud:
-    gateway:
-      metrics:
-        enabled: true
-      routes:
-      - id: aggr-api
-        uri: http://localhost:8081
-        predicates:
-        - Path=/api/aggr/**
-        filters:
-        - RewritePath=/api/aggr/(?<suffix>.*), /$\{suffix}
-      - id: base-api
-        uri: http://localhost:8082
-        predicates:
-        - Path=/api/base/**
-        filters:
-        - RewritePath=/api/base/(?<suffix>.*), /$\{suffix}
-      - id: system-api
-        uri: http://localhost:8082
-        predicates:
-        - Path=/api/system/**
-        filters:
-        - RewritePath=/api/system/(?<suffix>.*), /$\{suffix}
-      - id: biz-api
-        uri: http://localhost:8082
-        predicates:
-        - Path=/api/biz/**
-        filters:
-        - RewritePath=/api/biz/(?<suffix>.*), /$\{suffix}
+
+feign:
+  client:
+    config:
+      default:
+        #errorDecoder: com.supwisdom.leaveschool.common.config.BaseExceptionErrorDecoder
+        connectTimeout: 12000
+        readTimeout: 12000
+        loggerLevel: full
+  hystrix:
+    enabled: true
+  httpclient:
+    enabled: true
+
+hystrix:
+  command:
+    default:
+      execution:
+        timeout:
+          enabled: true
+        isolation:
+          thread:
+            timeoutInMilliseconds: 12000
 
 
 ##
 # infras.online-doc
 #
-infras.online-doc.enabled: false
+infras.online-doc.enabled: true
 infras.online-doc.md-docs.staitc.path: /Users/loie/c/work/git/institute/sw-backend/doc/
 infras.online-doc.api-docs.staitc.path: /Users/loie/c/work/git/institute/sw-backend/api-docs/
 
 
 ##
-# infras.security basic
+# server url for feign
 #
-infras.security.basic.enabled: true
+sw-backend-base-api:
+  uri: http://localhost:8082
 
+sw-backend-system-api: 
+  uri: http://localhost:8082
 
-##
-# infras.security jwt
-#
-infras.security.jwt.enabled: false
-
-#infras.security.jwt.public-key-pem: |-
-#  -----BEGIN PUBLIC KEY-----
-#  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBQw6TmvJ+nOuRaLoHsZJGIBzRg/wbskNv6UevL3/nQioYooptPfdIHVzPiKRVT5+DW5+nqzav3DOxY+HYKjO9nFjYdj0sgvRae6iVpa5Ji1wbDKOvwIDNukgnKbqvFXX2Isfl0RxeN3uEKdjeFGGFdr38I3ADCNKFNxtbmfqvjQIDAQAB
-#  -----END PUBLIC KEY-----
-#infras.security.jwt.private-key-pem-pkcs8: |-
-#  -----BEGIN PRIVATE KEY-----
-#  MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMFDDpOa8n6c65FougexkkYgHNGD/BuyQ2/pR68vf+dCKhiiim0990gdXM+IpFVPn4Nbn6erNq/cM7Fj4dgqM72cWNh2PSyC9Fp7qJWlrkmLXBsMo6/AgM26SCcpuq8VdfYix+XRHF43e4Qp2N4UYYV2vfwjcAMI0oU3G1uZ+q+NAgMBAAECgYA7jA7UuhxXmMAYmJ0hO7xnMQPQJouqeP3AYK9+sfMF7WQNHR/r0vj7Vli/dUm1I4hxr+x8fAuomf+ve6gds7sm+v2JHLzEIyPPiogoC7IcBmjJ3yVzW/26cXeOmTiPC/fW2g4BpYxSM8HLDaSkrtqzy8e9ijlzMpHBvvwLikufnQJBAOXaqIPuZ7Vm/JwQHAmX2HV+Qk6GMi/H7mL8X0AaW68w+Iccdbz1hzmMBfdn5NMmx2AOwoBAVivgjt0a1OfksHMCQQDXPtXxwFy4dQ4TbPu8L38P8s/bPo9ib1YkEMp57yBw+IvxB7jnpA9rUYTfZM/HpVP7r9rfVEUylVXXzhz1qx//AkEApWJOTBdW8bQ3YEdLFS/3pJqDNSLjq3OMuBZkpqgQfh6bRAQbRynW8XYpuNk9URye6iPUmRkxp4J86ORseqoWtwJAJb5a/b1hhObhxP5DVkht23oUgLmDoxsq28AmASOxaJ3szCMyhUv7eDIfPp0K4lNXWrcHhkncqHYPS3xVD68mOQJAV4SRDdWpgAbQOUODotohE48RxrabHo0l228CJ/pnm0q7gplPs4iSNJ2eijFuOMXfKkq3z/vxiNSA59FcdoCOHQ==
-#  -----END PRIVATE KEY-----
-
-
-##
-# infras.security cas
-#
-infras.security.cas.enabled: false
-
-#应用访问地址
-app.server.host.url: http://localhost:8080
-#应用登录地址
-app.login.url: /cas/login
-#应用登出地址
-app.logout.url: /cas/logout
-
-#CAS服务地址
-cas.server.host.url: https://cas.supwisdom.com/cas
+sw-backend-biz-api: 
+  uri: http://localhost:8082
diff --git a/bff/admin/src/main/resources/bootstrap.yml b/bff/admin/src/main/resources/bootstrap.yml
index 2df1be7..b2a926b 100644
--- a/bff/admin/src/main/resources/bootstrap.yml
+++ b/bff/admin/src/main/resources/bootstrap.yml
@@ -1,3 +1,3 @@
 spring:
   application:
-    name: sw-backend-admin-bff
+    name: sw-backend-admin-aggr
