refactor: 将 bff 的gateway 迁移到 gateway 项目下,将 aggr 重命名为 bff
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/Application.java b/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/Application.java
deleted file mode 100644
index f3762ce..0000000
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/Application.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.supwisdom.institute.backend.admin.aggr;
-
-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.web.cors.CorsConfiguration;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-import org.springframework.web.filter.CorsFilter;
-
-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;
-
-@SpringBootApplication
-@EnableFeignClients
-
-@EnableSimpleUserTransmit
-@EnableCustomExceptionHandler
-
-@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);
-
-    return new CorsFilter(source);
-  }
-
-}
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/configuration/Swagger2Config.java b/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/configuration/Swagger2Config.java
deleted file mode 100644
index d6311e2..0000000
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/configuration/Swagger2Config.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.supwisdom.institute.backend.admin.aggr.configuration;
-
-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.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
-import springfox.documentation.spi.DocumentationType;
-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;
-
-@Configuration
-@EnableSwagger2
-public class Swagger2Config {
-
-  @Value("${swagger2.apis.basePackage:com.supwisdom.institute}")
-  private String basePackage;
-
-  @Bean
-  public Docket createRestApi() {
-    return new Docket(DocumentationType.SWAGGER_2)
-        .apiInfo(apiInfo())
-        .select()
-        .apis(RequestHandlerSelectors.basePackage(basePackage))
-        .paths(PathSelectors.any())
-        .build()
-        ;
-  }
-
-  private ApiInfo apiInfo() {
-    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 Aggregator APIs")
-        .description("管理后台 - 聚合接口")
-        .termsOfServiceUrl("http://www.supwisdom.com/")
-        .contact(contact)
-        .version("1.0")
-        .build();
-  }
-
-  @Bean
-  UiConfiguration uiConfig() {
-    
-    return UiConfigurationBuilder.builder().build();
-    
-//    return new UiConfiguration(null, // url
-//        "none", // docExpansion => none | list
-//        "alpha", // apiSorter => alpha
-//        "schema", // defaultModelRendering => schema
-//        UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS,
-//        false, // enableJsonEditor => true || false
-//        true, // showRequestHeaders => true | false
-//        60000L); // requestTimeout => in milliseconds, defaults to null
-//    // (uses jquery xh timeout)
-  }
-
-}
diff --git a/aggr/admin/src/main/resources/application-docker.yml b/aggr/admin/src/main/resources/application-docker.yml
deleted file mode 100644
index 78c8a3d..0000000
--- a/aggr/admin/src/main/resources/application-docker.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-server:
-  port: ${SERVER_PORT:8443}
-  ssl:
-    enabled: ${SSL_ENABLED:true}
-    clientAuth: NEED
-    key-store: ${SSL_KEYSTORE_FILE:file:/certs/server/server.keystore}
-    key-store-password: ${SSL_KEYSTORE_PASSWORD:}
-    trust-store: ${SSL_TRUSTSTORE_FILE:file:/certs/server/server.truststore}
-    trust-store-password: ${SSL_TRUSTSTORE_PASSWORD:}
-  tomcat: 
-    accesslog: 
-      enabled: ${TOMCAT_ACCESSLOG_ENABLED:false}
-      buffered: ${TOMCAT_ACCESSLOG_BUFFERED:true}
-      directory: ${TOMCAT_ACCESSLOG_DIR:log}
-      prefix: ${TOMCAT_ACCESSLOG_PREFIX:sa-api-accesslog}
-      suffix: ${TOMCAT_ACCESSLOG_SUFFIX:.log}
-      file-date-format: ${TOMCAT_ACCESSLOG_FILE_DATE_FORMAT:.yyyy-MM-dd}
-      rotate: ${TOMCAT_ACCESSLOG_ROTATE:true}
-
-
-##
-# logging
-#
-logging:
-  level:
-    root: INFO
-    com.supwisdom: INFO
-
-
-spring:
-  jackson:
-    time-zone: ${JACKSON_TIME_ZONE:Asia/Shanghai}
-
-
-##
-# 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/}
-infras.online-doc.api-docs.staitc.path: ${INFRAS_ONLINE_DOC_API_DOCS_STATIC_PATH:/api-docs/}
-
-
-##
-# server url for feign
-#
-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:}
-
-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/aggr/admin/src/main/resources/application.yml b/aggr/admin/src/main/resources/application.yml
deleted file mode 100644
index 8ad7215..0000000
--- a/aggr/admin/src/main/resources/application.yml
+++ /dev/null
@@ -1,68 +0,0 @@
-server:
-  port: 8081
-  ssl:
-    enabled: false
-
-
-##
-# logging
-#
-logging:
-  level:
-    root: INFO
-    com.supwisdom: DEBUG
-#    org.springframework.web: INFO
-#    org.springframework.cloud.openfeign: INFO
-
-
-swagger2.apis.basePackage: com.supwisdom.institute
-
-
-spring:
-  jackson:
-    time-zone: Asia/Shanghai
-
-
-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: 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/
-
-
-##
-# server url for feign
-#
-sw-backend-base-api:
-  uri: http://localhost:8082
-
-sw-backend-system-api: 
-  uri: http://localhost:8082
-
-sw-backend-biz-api: 
-  uri: http://localhost:8082
diff --git a/aggr/admin/src/main/resources/bootstrap.yml b/aggr/admin/src/main/resources/bootstrap.yml
deleted file mode 100644
index b2a926b..0000000
--- a/aggr/admin/src/main/resources/bootstrap.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-spring:
-  application:
-    name: sw-backend-admin-aggr
diff --git a/aggr/pom.xml b/aggr/pom.xml
deleted file mode 100644
index 1ec35e6..0000000
--- a/aggr/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  
-  <parent>
-    <groupId>com.supwisdom.institute</groupId>
-    <artifactId>sw-backend-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-  </parent>
-  
-  <groupId>com.supwisdom.institute</groupId>
-  <artifactId>sw-backend-aggr-parent</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  <packaging>pom</packaging>
-
-  <name>Supwisdom Backend Framework Aggregator API</name>
-  <description>Supwisdom Backend Framework Aggregator API project</description>
-
-  <modules>
-    <module>admin</module>
-  </modules>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-deploy-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
diff --git a/aggr/admin/.gitignore b/bff/admin/.gitignore
similarity index 100%
rename from aggr/admin/.gitignore
rename to bff/admin/.gitignore
diff --git a/bff/admin/Dockerfile b/bff/admin/Dockerfile
index 372661c..b91c9f4 100644
--- a/bff/admin/Dockerfile
+++ b/bff/admin/Dockerfile
@@ -1,4 +1,4 @@
-FROM harbor.supwisdom.com/institute/openjdk:8-jre
+FROM harbor.supwisdom.com/institute/openjdk:8-jre-alpine
 
 ENV ENABLE_JMX_SSL=false
 ENV JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker
diff --git a/bff/admin/pom.xml b/bff/admin/pom.xml
index 0f600d2..d141279 100644
--- a/bff/admin/pom.xml
+++ b/bff/admin/pom.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
@@ -19,7 +19,7 @@
   <description>Supwisdom Backend Framework Admin Backend for Frontend project</description>
 
   <properties>
-    <start-class>com.supwisdom.institute.admin.bff.Application</start-class>
+    <start-class>com.supwisdom.institute.backend.admin.bff.Application</start-class>
   </properties>
 
   <dependencies>
@@ -31,13 +31,6 @@
     </dependency>
 
     <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-
-
-    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
     </dependency>
@@ -48,27 +41,28 @@
       <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
 
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-webflux</artifactId>
-    </dependency>
-    
+
     <dependency>
       <groupId>org.springframework.cloud</groupId>
-      <artifactId>spring-cloud-starter-gateway</artifactId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
 
 
-    <!-- <dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>com.supwisdom.infras</groupId>
       <artifactId>infras-online-doc</artifactId>
-    </dependency> -->
+    </dependency>
 
 
     <!-- <dependency>
       <groupId>com.supwisdom.infras</groupId>
       <artifactId>infras-mvc</artifactId>
-    </dependency>
+    </dependency> -->
 
     <dependency>
       <groupId>com.supwisdom.infras</groupId>
@@ -83,34 +77,6 @@
     <dependency>
       <groupId>com.supwisdom.infras</groupId>
       <artifactId>infras-lang</artifactId>
-    </dependency> -->
-
-
-    <!-- <dependency>
-      <groupId>com.supwisdom.infras</groupId>
-      <artifactId>infras-security</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.springframework.boot</groupId>
-          <artifactId>spring-boot-starter-web</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency> -->
-
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-security</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>io.jsonwebtoken</groupId>
-      <artifactId>jjwt</artifactId>
-      <version>0.9.1</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework.security</groupId>
-      <artifactId>spring-security-cas</artifactId>
     </dependency>
 
 
@@ -118,13 +84,19 @@
       <groupId>com.supwisdom.institute</groupId>
       <artifactId>sw-backend-common-framework</artifactId>
     </dependency>
-
-
+    
+    
+    <!-- openfeign's dependency -->
     <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>fastjson</artifactId>
+      <groupId>com.netflix.feign</groupId>
+      <artifactId>feign-httpclient</artifactId>
     </dependency>
 
+    <!-- <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+    </dependency> -->
+
 
     <dependency>
       <groupId>io.springfox</groupId>
@@ -136,6 +108,12 @@
     </dependency>
 
 
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+
     <!-- 热部署,无需重启项目 -->
     <dependency>
       <groupId>org.springframework.boot</groupId>
@@ -143,6 +121,7 @@
       <scope>runtime</scope>
     </dependency>
 
+
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
@@ -180,6 +159,7 @@
       <!-- <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
+        <version>2.4.3</version>
         <configuration>
           <encoding>${project.build.sourceEncoding}</encoding>
         </configuration>
@@ -196,24 +176,24 @@
               <overwrite>true</overwrite>
               <resources>
                 <resource>
-                  <directory>${basedir}/../../doc</directory>
+                  <directory>${basedir}/../doc</directory>
                 </resource>
               </resources>
             </configuration>
           </execution>
           <execution>
-            <id>copy-certs-jwt-resources</id>
+            <id>copy-api-docs-resources</id>
             <phase>package</phase>
             <goals>
               <goal>copy-resources</goal>
             </goals>
             <configuration>
               <encoding>utf-8</encoding>
-              <outputDirectory>${basedir}/target/certs/jwt</outputDirectory>
+              <outputDirectory>${basedir}/target/api-docs</outputDirectory>
               <overwrite>true</overwrite>
               <resources>
                 <resource>
-                  <directory>${basedir}/../../certs/jwt</directory>
+                  <directory>${basedir}/../api-docs</directory>
                 </resource>
               </resources>
             </configuration>
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/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/.gitkeep
similarity index 100%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/.gitkeep
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/.gitkeep
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/base/AdminBaseController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/base/AdminBaseController.java
similarity index 88%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/base/AdminBaseController.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/base/AdminBaseController.java
index 2411d5e..62927da 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/base/AdminBaseController.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/base/AdminBaseController.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.controller.base;
+package com.supwisdom.institute.backend.admin.bff.apis.controller.base;
 
 import org.springframework.util.MimeTypeUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/biz/AdminBizController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/biz/AdminBizController.java
similarity index 80%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/biz/AdminBizController.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/biz/AdminBizController.java
index 30dfbcd..8ce27ec 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/controller/biz/AdminBizController.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/controller/biz/AdminBizController.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.controller.biz;
+package com.supwisdom.institute.backend.admin.bff.apis.controller.biz;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.MimeTypeUtils;
@@ -6,7 +6,7 @@
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.admin.aggr.apis.service.biz.BizService;
+import com.supwisdom.institute.backend.admin.bff.apis.service.biz.BizService;
 
 @RestController
 @RequestMapping(value = "/api/bff/v1/admin/biz")
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/model/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/.gitkeep
similarity index 100%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/model/.gitkeep
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/.gitkeep
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/model/biz/Biz.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
similarity index 87%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/model/biz/Biz.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
index b36e117..f1d904e 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/model/biz/Biz.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.model.biz;
+package com.supwisdom.institute.backend.admin.bff.apis.model.biz;
 
 import java.util.Date;
 
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/.gitkeep
similarity index 100%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/.gitkeep
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/.gitkeep
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/base/configuration/BaseFeignClientConfiguration.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/configuration/BaseFeignClientConfiguration.java
similarity index 94%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/base/configuration/BaseFeignClientConfiguration.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/configuration/BaseFeignClientConfiguration.java
index 1e4e614..3b327f5 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/base/configuration/BaseFeignClientConfiguration.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/configuration/BaseFeignClientConfiguration.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.base.configuration;
+package com.supwisdom.institute.backend.admin.bff.apis.remote.base.configuration;
 
 import org.apache.http.conn.HttpClientConnectionManager;
 import org.springframework.beans.factory.annotation.Value;
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
similarity index 78%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/base/v1/admin/AdminAccountRemoteFallbackFactory.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFallbackFactory.java
index 586942a..1ff4981 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.base.v1.admin;
+package com.supwisdom.institute.backend.admin.bff.apis.remote.base.v1.admin;
 
 import feign.hystrix.FallbackFactory;
 
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
similarity index 65%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/base/v1/admin/AdminAccountRemoteFeignClient.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/base/v1/admin/AdminAccountRemoteFeignClient.java
index 133309c..99b04b8 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
@@ -1,8 +1,8 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.base.v1.admin;
+package com.supwisdom.institute.backend.admin.bff.apis.remote.base.v1.admin;
 
 import org.springframework.cloud.openfeign.FeignClient;
 
-import com.supwisdom.institute.backend.admin.aggr.apis.remote.base.configuration.BaseFeignClientConfiguration;
+import com.supwisdom.institute.backend.admin.bff.apis.remote.base.configuration.BaseFeignClientConfiguration;
 
 @FeignClient(
     configuration = {BaseFeignClientConfiguration.class},
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/biz/configuration/BizFeignClientConfiguration.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/configuration/BizFeignClientConfiguration.java
similarity index 94%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/biz/configuration/BizFeignClientConfiguration.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/configuration/BizFeignClientConfiguration.java
index ca60e7d..04d8547 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/biz/configuration/BizFeignClientConfiguration.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/configuration/BizFeignClientConfiguration.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.biz.configuration;
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz.configuration;
 
 import org.apache.http.conn.HttpClientConnectionManager;
 import org.springframework.beans.factory.annotation.Value;
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
similarity index 85%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/biz/v1/admin/AdminBizRemoteFallbackFactory.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFallbackFactory.java
index d27ce1f..bd220ef 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
@@ -1,10 +1,10 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.biz.v1.admin;
+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.aggr.apis.model.biz.Biz;
-import com.supwisdom.institute.backend.admin.aggr.apis.remote.exception.FallbackError;
+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;
 
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
similarity index 84%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/biz/v1/admin/AdminBizRemoteFeignClient.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/v1/admin/AdminBizRemoteFeignClient.java
index 99ec029..a5628c1 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.biz.v1.admin;
+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;
@@ -8,8 +8,8 @@
 import org.springframework.web.bind.annotation.RequestParam;
 
 import com.alibaba.fastjson.JSONObject;
-import com.supwisdom.institute.backend.admin.aggr.apis.model.biz.Biz;
-import com.supwisdom.institute.backend.admin.aggr.apis.remote.biz.configuration.BizFeignClientConfiguration;
+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},
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/exception/FallbackError.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/exception/FallbackError.java
similarity index 83%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/exception/FallbackError.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/exception/FallbackError.java
index 51ae782..debd57d 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/remote/exception/FallbackError.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/exception/FallbackError.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.remote.exception;
+package com.supwisdom.institute.backend.admin.bff.apis.remote.exception;
 
 import com.alibaba.fastjson.JSONObject;
 
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/service/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/.gitkeep
similarity index 100%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/service/.gitkeep
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/.gitkeep
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/service/biz/BizService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
similarity index 71%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/service/biz/BizService.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
index acc2ac7..2ed6c10 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/service/biz/BizService.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
@@ -1,11 +1,11 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.service.biz;
+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.aggr.apis.remote.biz.v1.admin.AdminBizRemoteFeignClient;
-import com.supwisdom.institute.backend.admin.aggr.apis.vo.biz.response.data.BizQueryResponseData;
+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 {
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/vo/.gitkeep b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/.gitkeep
similarity index 100%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/vo/.gitkeep
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/.gitkeep
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
similarity index 83%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/apis/vo/biz/response/data/BizQueryResponseData.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/biz/response/data/BizQueryResponseData.java
index 815cc6a..cc9c465 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/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
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.apis.vo.biz.response.data;
+package com.supwisdom.institute.backend.admin.bff.apis.vo.biz.response.data;
 
 import java.util.List;
 import java.util.Map;
@@ -6,7 +6,7 @@
 import lombok.Getter;
 import lombok.Setter;
 
-import com.supwisdom.institute.backend.admin.aggr.apis.model.biz.Biz;
+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> {
diff --git a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/configuration/FeignBasicAuthRequestInterceptor.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/FeignBasicAuthRequestInterceptor.java
similarity index 97%
rename from aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/configuration/FeignBasicAuthRequestInterceptor.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/FeignBasicAuthRequestInterceptor.java
index a0f7c62..2a22b46 100644
--- a/aggr/admin/src/main/java/com/supwisdom/institute/backend/admin/aggr/configuration/FeignBasicAuthRequestInterceptor.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/FeignBasicAuthRequestInterceptor.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.aggr.configuration;
+package com.supwisdom.institute.backend.admin.bff.configuration;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
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/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/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/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/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
diff --git a/aggr/admin/.gitignore b/gateway/.gitignore
similarity index 100%
copy from aggr/admin/.gitignore
copy to gateway/.gitignore
diff --git a/aggr/admin/Dockerfile b/gateway/Dockerfile
similarity index 88%
rename from aggr/admin/Dockerfile
rename to gateway/Dockerfile
index b91c9f4..372661c 100644
--- a/aggr/admin/Dockerfile
+++ b/gateway/Dockerfile
@@ -1,4 +1,4 @@
-FROM harbor.supwisdom.com/institute/openjdk:8-jre-alpine
+FROM harbor.supwisdom.com/institute/openjdk:8-jre
 
 ENV ENABLE_JMX_SSL=false
 ENV JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker
diff --git a/aggr/admin/pom.xml b/gateway/pom.xml
similarity index 76%
rename from aggr/admin/pom.xml
rename to gateway/pom.xml
index 013b8c2..7f39a11 100644
--- a/aggr/admin/pom.xml
+++ b/gateway/pom.xml
@@ -1,5 +1,5 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
@@ -7,19 +7,18 @@
     <groupId>com.supwisdom.institute</groupId>
     <artifactId>sw-backend-parent</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>com.supwisdom.institute</groupId>
-  <artifactId>sw-backend-admin-aggr</artifactId>
+  <artifactId>sw-backend-gateway</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
 
-  <name>Supwisdom Backend Framework Admin Aggregator API</name>
-  <description>Supwisdom Backend Framework Admin Aggregator API project</description>
+  <name>Supwisdom Backend Framework Gateway</name>
+  <description>Supwisdom Backend Framework Gateway project</description>
 
   <properties>
-    <start-class>com.supwisdom.institute.backend.admin.aggr.Application</start-class>
+    <start-class>com.supwisdom.institute.backend.gateway.Application</start-class>
   </properties>
 
   <dependencies>
@@ -31,6 +30,13 @@
     </dependency>
 
     <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+
+    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
     </dependency>
@@ -41,29 +47,28 @@
       <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
 
-
-    <dependency>
-      <groupId>org.springframework.cloud</groupId>
-      <artifactId>spring-cloud-starter-openfeign</artifactId>
-    </dependency>
-
-
     <dependency>
       <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-web</artifactId>
+      <artifactId>spring-boot-starter-webflux</artifactId>
     </dependency>
-
+    
     <dependency>
-      <groupId>com.supwisdom.infras</groupId>
-      <artifactId>infras-online-doc</artifactId>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-gateway</artifactId>
     </dependency>
 
 
     <!-- <dependency>
       <groupId>com.supwisdom.infras</groupId>
-      <artifactId>infras-mvc</artifactId>
+      <artifactId>infras-online-doc</artifactId>
     </dependency> -->
 
+
+    <!-- <dependency>
+      <groupId>com.supwisdom.infras</groupId>
+      <artifactId>infras-mvc</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>com.supwisdom.infras</groupId>
       <artifactId>infras-object-mapper</artifactId>
@@ -77,6 +82,28 @@
     <dependency>
       <groupId>com.supwisdom.infras</groupId>
       <artifactId>infras-lang</artifactId>
+    </dependency> -->
+
+
+    <dependency>
+      <groupId>com.supwisdom.infras</groupId>
+      <artifactId>infras-security</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>io.jsonwebtoken</groupId>
+      <artifactId>jjwt</artifactId>
+      <version>0.9.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-cas</artifactId>
     </dependency>
 
 
@@ -84,18 +111,12 @@
       <groupId>com.supwisdom.institute</groupId>
       <artifactId>sw-backend-common-framework</artifactId>
     </dependency>
-    
-    
-    <!-- openfeign's dependency -->
-    <dependency>
-      <groupId>com.netflix.feign</groupId>
-      <artifactId>feign-httpclient</artifactId>
-    </dependency>
 
-    <!-- <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-    </dependency> -->
+
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+    </dependency>
 
 
     <dependency>
@@ -108,12 +129,6 @@
     </dependency>
 
 
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-
     <!-- 热部署,无需重启项目 -->
     <dependency>
       <groupId>org.springframework.boot</groupId>
@@ -121,7 +136,6 @@
       <scope>runtime</scope>
     </dependency>
 
-
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
@@ -159,7 +173,6 @@
       <!-- <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
-        <version>2.4.3</version>
         <configuration>
           <encoding>${project.build.sourceEncoding}</encoding>
         </configuration>
@@ -176,24 +189,24 @@
               <overwrite>true</overwrite>
               <resources>
                 <resource>
-                  <directory>${basedir}/../doc</directory>
+                  <directory>${basedir}/../../doc</directory>
                 </resource>
               </resources>
             </configuration>
           </execution>
           <execution>
-            <id>copy-api-docs-resources</id>
+            <id>copy-certs-jwt-resources</id>
             <phase>package</phase>
             <goals>
               <goal>copy-resources</goal>
             </goals>
             <configuration>
               <encoding>utf-8</encoding>
-              <outputDirectory>${basedir}/target/api-docs</outputDirectory>
+              <outputDirectory>${basedir}/target/certs/jwt</outputDirectory>
               <overwrite>true</overwrite>
               <resources>
                 <resource>
-                  <directory>${basedir}/../api-docs</directory>
+                  <directory>${basedir}/../../certs/jwt</directory>
                 </resource>
               </resources>
             </configuration>
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/InfrasSecurityReactiveAutoConfiguration.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/InfrasSecurityReactiveAutoConfiguration.java
new file mode 100644
index 0000000..1ea28f4
--- /dev/null
+++ b/gateway/src/main/java/com/supwisdom/infras/security/reactive/InfrasSecurityReactiveAutoConfiguration.java
@@ -0,0 +1,66 @@
+package com.supwisdom.infras.security.reactive;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.User.UserBuilder;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.server.WebFilterChainProxy;
+
+import com.supwisdom.infras.security.api.InfrasApiUserController;
+
+import reactor.core.publisher.Flux;
+
+@Configuration
+@ConditionalOnClass({ Flux.class, EnableWebFluxSecurity.class, WebFilterChainProxy.class })
+public class InfrasSecurityReactiveAutoConfiguration {
+
+  private static final Logger logger = LoggerFactory.getLogger(InfrasSecurityReactiveAutoConfiguration.class);
+  
+  @Bean
+  @ConditionalOnMissingBean({PasswordEncoder.class})
+  public PasswordEncoder passwordEncoder() {
+    
+    PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
+    logger.debug("InfrasSecurityReactiveAutoConfiguration passwordEncoder is {}", passwordEncoder);
+    
+    return passwordEncoder;
+  }
+
+  @Bean
+  @ConditionalOnMissingBean({ReactiveUserDetailsService.class})
+  public MapReactiveUserDetailsService reactiveUserDetailsService() {
+    
+    // ensure the passwords are encoded properly
+    @SuppressWarnings("deprecation")
+    UserBuilder users = User.withDefaultPasswordEncoder();
+    
+    MapReactiveUserDetailsService reactiveUserDetailsService = new MapReactiveUserDetailsService(
+        users.username("user").password("password").roles("USER").build(),
+        users.username("admin").password("password").roles("USER","ADMIN").build()
+        );
+    logger.debug("InfrasSecurityReactiveAutoConfiguration reactiveUserDetailsService is {}", reactiveUserDetailsService);
+    
+    return reactiveUserDetailsService;
+  }
+  
+  
+  
+  @Bean
+  @ConditionalOnMissingBean(InfrasApiUserController.class)
+  public InfrasApiUserController infrasApiUserController() {
+    InfrasApiUserController infrasApiUserController = new InfrasApiUserController();
+    logger.debug("InfrasSecurityReactiveAutoConfiguration infrasApiUserController is {}", infrasApiUserController);
+    
+    return infrasApiUserController;
+  }
+  
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
similarity index 79%
rename from bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
rename to gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
index 6d71175..aa792e1 100644
--- a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
+++ b/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
@@ -4,8 +4,10 @@
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpMethod;
+import org.springframework.security.config.web.server.SecurityWebFiltersOrder;
 import org.springframework.security.config.web.server.ServerHttpSecurity;
 import org.springframework.security.web.server.SecurityWebFilterChain;
+import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers;
 
 @Configuration
 @ConditionalOnProperty(name="infras.security.basic.enabled", havingValue="true")
@@ -14,6 +16,7 @@
   @Bean
   public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
       http
+          .securityMatcher(ServerWebExchangeMatchers.pathMatchers("/api/**"))
           .authorizeExchange()
               .pathMatchers(HttpMethod.OPTIONS).permitAll()
               .pathMatchers("/api/public/**", "/api/open/**").permitAll()
@@ -22,6 +25,8 @@
               .pathMatchers("/api/**").authenticated()
               .anyExchange().authenticated();
       
+      //http.addFilterAt(webFilter, SecurityWebFiltersOrder.LAST);
+      
       http.httpBasic();
       
       http.csrf().disable();
diff --git a/bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
similarity index 100%
rename from bff/admin/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
rename to gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/Application.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/Application.java
new file mode 100644
index 0000000..aea520c
--- /dev/null
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/Application.java
@@ -0,0 +1,83 @@
+package com.supwisdom.institute.backend.gateway;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+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 reactor.core.publisher.Mono;
+
+import com.supwisdom.infras.security.reactive.basic.EnableInfrasBasicWebFluxApi;
+import com.supwisdom.institute.backend.common.framework.exception.EnableCustomExceptionHandler;
+
+import static org.springframework.web.cors.CorsConfiguration.ALL;
+
+@SpringBootApplication
+
+@EnableCustomExceptionHandler
+
+//@EnableInfrasOnlineDoc
+
+//@EnableInfrasCasSecurity
+
+//@EnableInfrasBasicApi
+//@EnableInfrasJWTApi
+
+@EnableInfrasBasicWebFluxApi
+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);
+    };
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GlobalFilterConfig.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/GlobalFilterConfig.java
similarity index 65%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GlobalFilterConfig.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/GlobalFilterConfig.java
index e9e6282..2e71ac7 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/GlobalFilterConfig.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/GlobalFilterConfig.java
@@ -1,9 +1,9 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
+package com.supwisdom.institute.backend.gateway.configuration;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import com.supwisdom.institute.backend.admin.bff.gateway.filter.SimpleUserTransmitGlobalFilter;
+import com.supwisdom.institute.backend.gateway.filter.SimpleUserTransmitGlobalFilter;
 
 @Configuration
 public class GlobalFilterConfig {
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/PasswordEncoderConfig.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/PasswordEncoderConfig.java
similarity index 93%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/PasswordEncoderConfig.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/PasswordEncoderConfig.java
index b44d152..f98770f 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/PasswordEncoderConfig.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/PasswordEncoderConfig.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
+package com.supwisdom.institute.backend.gateway.configuration;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/UserDetailsServiceConfig.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/UserDetailsServiceConfig.java
similarity index 75%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/UserDetailsServiceConfig.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/UserDetailsServiceConfig.java
index 63945f4..cafbc17 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/UserDetailsServiceConfig.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/configuration/UserDetailsServiceConfig.java
@@ -1,10 +1,10 @@
-package com.supwisdom.institute.backend.admin.bff.configuration;
+package com.supwisdom.institute.backend.gateway.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 com.supwisdom.institute.backend.gateway.security.core.userdetails.InMemeryUserDetailsService;
+import com.supwisdom.institute.backend.gateway.security.core.userdetails.MyUserDetailsService;
 
 import lombok.extern.slf4j.Slf4j;
 
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/SimpleUserTransmitGlobalFilter.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/SimpleUserTransmitGlobalFilter.java
similarity index 92%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/SimpleUserTransmitGlobalFilter.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/SimpleUserTransmitGlobalFilter.java
index a9bf2ae..4cd8faf 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/gateway/filter/SimpleUserTransmitGlobalFilter.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/SimpleUserTransmitGlobalFilter.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.bff.gateway.filter;
+package com.supwisdom.institute.backend.gateway.filter;
 
 import java.net.URLDecoder;
 
@@ -14,7 +14,7 @@
 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.gateway.security.core.userdetails.MyUser;
 import com.supwisdom.institute.backend.common.core.transmit.user.User;
 import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
 
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/InMemeryUserDetailsService.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/InMemeryUserDetailsService.java
similarity index 96%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/InMemeryUserDetailsService.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/InMemeryUserDetailsService.java
index bfe9a21..4e761a5 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/InMemeryUserDetailsService.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/InMemeryUserDetailsService.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.bff.security.core.userdetails;
+package com.supwisdom.institute.backend.gateway.security.core.userdetails;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUser.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUser.java
similarity index 94%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUser.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUser.java
index b662422..7148839 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUser.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUser.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.bff.security.core.userdetails;
+package com.supwisdom.institute.backend.gateway.security.core.userdetails;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUserDetailsService.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java
similarity index 96%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUserDetailsService.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java
index 110af6b..e5bfec8 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/security/core/userdetails/MyUserDetailsService.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.admin.bff.security.core.userdetails;
+package com.supwisdom.institute.backend.gateway.security.core.userdetails;
 
 import java.util.ArrayList;
 import java.util.Calendar;
diff --git a/gateway/src/main/resources/application-docker.yml b/gateway/src/main/resources/application-docker.yml
new file mode 100644
index 0000000..b5ea861
--- /dev/null
+++ b/gateway/src/main/resources/application-docker.yml
@@ -0,0 +1,105 @@
+server:
+  port: ${SERVER_PORT:8443}
+  ssl:
+    enabled: ${SSL_ENABLED:true}
+    clientAuth: NEED
+    key-store: ${SSL_KEYSTORE_FILE:file:/certs/server/server.keystore}
+    key-store-password: ${SSL_KEYSTORE_PASSWORD:}
+    trust-store: ${SSL_TRUSTSTORE_FILE:file:/certs/server/server.truststore}
+    trust-store-password: ${SSL_TRUSTSTORE_PASSWORD:}
+  tomcat: 
+    accesslog: 
+      enabled: ${TOMCAT_ACCESSLOG_ENABLED:false}
+      buffered: ${TOMCAT_ACCESSLOG_BUFFERED:true}
+      directory: ${TOMCAT_ACCESSLOG_DIR:log}
+      prefix: ${TOMCAT_ACCESSLOG_PREFIX:sa-api-accesslog}
+      suffix: ${TOMCAT_ACCESSLOG_SUFFIX:.log}
+      file-date-format: ${TOMCAT_ACCESSLOG_FILE_DATE_FORMAT:.yyyy-MM-dd}
+      rotate: ${TOMCAT_ACCESSLOG_ROTATE:true}
+
+
+##
+# logging
+#
+logging:
+  level:
+    root: INFO
+    com.supwisdom: INFO
+
+
+spring:
+  jackson:
+    time-zone: ${JACKSON_TIME_ZONE:Asia/Shanghai}
+
+
+##
+# spring cloud gateway
+#
+  cloud:
+    gateway:
+      metrics:
+        enabled: true
+      routes:
+      - id: bff-api
+        uri: ${SW_BACKEND_AGGR_API_URI:https://sw-backend-admin-bff}
+        predicates:
+        - Path=/api/bff/**
+        filters:
+        - RewritePath=/api/bff/(?<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
+#
+infras.online-doc.enabled: ${INFRAS_ONLINE_DOC_ENABLED:false}
+infras.online-doc.md-docs.staitc.path: ${INFRAS_ONLINE_DOC_MD_DOCS_STATIC_PATH:/doc/}
+infras.online-doc.api-docs.staitc.path: ${INFRAS_ONLINE_DOC_API_DOCS_STATIC_PATH:/api-docs/}
+
+
+##
+# infras.security basic
+#
+infras.security.basic.enabled: ${INFRAS_SECURITY_BASIC_ENABLED:true}
+
+
+##
+# 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}
diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml
new file mode 100644
index 0000000..e98b431
--- /dev/null
+++ b/gateway/src/main/resources/application.yml
@@ -0,0 +1,96 @@
+server:
+  port: 8080
+
+
+##
+# logging
+#
+logging:
+  level:
+    root: INFO
+    com.supwisdom: DEBUG
+#    org.springframework.web: INFO
+#    org.springframework.cloud.openfeign: INFO
+
+
+spring:
+  jackson:
+    time-zone: Asia/Shanghai
+
+##
+# spring cloud gateway
+#
+  cloud:
+    gateway:
+      metrics:
+        enabled: true
+      routes:
+      - id: bff-api
+        uri: http://localhost:8081
+        predicates:
+        - Path=/api/bff/**
+        filters:
+        - RewritePath=/api/bff/(?<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}
+
+
+##
+# infras.online-doc
+#
+infras.online-doc.enabled: false
+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
+#
+infras.security.basic.enabled: true
+
+
+##
+# 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
diff --git a/gateway/src/main/resources/bootstrap.yml b/gateway/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..aa852b8
--- /dev/null
+++ b/gateway/src/main/resources/bootstrap.yml
@@ -0,0 +1,3 @@
+spring:
+  application:
+    name: sw-backend-gateway
diff --git a/pom.xml b/pom.xml
index 0d4638d..0a273a4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,8 +24,9 @@
     <module>biz</module>
 
     <module>sa</module>
-    <module>aggr</module>
     <module>bff</module>
+
+    <module>gateway</module>
     
   </modules>