chore: 异常infras示例代码,采用jar包依赖
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/api/InfrasApiUserController.java b/gateway/src/main/java/com/supwisdom/infras/security/api/InfrasApiUserController.java
deleted file mode 100644
index 26eea40..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/api/InfrasApiUserController.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.supwisdom.infras.security.api;
-
-import java.security.Principal;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.supwisdom.infras.security.authentication.JwtAuthenticationToken;
-import com.supwisdom.infras.security.core.userdetails.InfrasUser;
-
-@RestController
-@RequestMapping("/api/user")
-public class InfrasApiUserController {
-
-  private static final Logger logger = LoggerFactory.getLogger(InfrasApiUserController.class);
-
-  @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-  @ResponseBody
-  public InfrasUser current(Principal principal) {
-    
-    logger.debug("ApiUserController.current(Principal) is {}", principal);
-    
-    if (principal == null) {
-      throw new RuntimeException("exception.principal.is.null");
-    }
-    
-    if (principal instanceof UsernamePasswordAuthenticationToken) {
-      
-      UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) principal;
-      
-      if (token.isAuthenticated()) {
-        if (token.getPrincipal() instanceof User) {
-          return (InfrasUser) token.getPrincipal();
-        }
-      }
-    } else if (principal instanceof JwtAuthenticationToken) {
-      JwtAuthenticationToken token = (JwtAuthenticationToken) principal;
-      
-      InfrasUser user = new InfrasUser((String) token.getPrincipal(), (String) token.getToken(), token.getAuthorities(), token.getAttributes());
-      user.eraseCredentials();
-      
-      return user;
-    }
-    
-    throw new RuntimeException("exception.principal.not.correct");
-  }
-  
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/authentication/JwtAuthenticationToken.java b/gateway/src/main/java/com/supwisdom/infras/security/authentication/JwtAuthenticationToken.java
deleted file mode 100644
index 73a1944..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/authentication/JwtAuthenticationToken.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.supwisdom.infras.security.authentication;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-
-public class JwtAuthenticationToken extends AbstractAuthenticationToken {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 4407107653933017523L;
-  
-  private Object principal;
-  private String credentials;
-  private String token;
-  
-  private final Map<String, Object> attributes;
-  
-  public Map<String, Object> getAttributes() {
-    return this.attributes;
-  }
-  
-  public JwtAuthenticationToken(String token) {
-    super(Collections.emptyList());
-    this.token = token;
-    
-    this.attributes = Collections.emptyMap();
-    
-    setAuthenticated(false);
-  }
-  
-  public JwtAuthenticationToken(Object principal, String token, 
-      Collection<? extends GrantedAuthority> authorities) {
-    this(principal, token, authorities, Collections.emptyMap());
-  }
-
-  public JwtAuthenticationToken(Object principal, String token, 
-      Collection<? extends GrantedAuthority> authorities, 
-      Map<? extends String, ? extends Object> attributes) {
-    super(authorities);
-    this.principal = principal;
-    this.token = token;
-    
-    this.attributes = Collections.unmodifiableMap(attributes);
-    
-    setAuthenticated(true);
-  }
-  
-  @Override
-  public void setDetails(Object details) {
-    super.setDetails(details);
-    
-    this.setAuthenticated(true);
-  }
-
-  @Override
-  public Object getCredentials() {
-    return credentials;
-  }
-
-  @Override
-  public Object getPrincipal() {
-    return principal;
-  }
-  
-  public String getToken() {
-    return token;
-  }
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/core/userdetails/InfrasUser.java b/gateway/src/main/java/com/supwisdom/infras/security/core/userdetails/InfrasUser.java
deleted file mode 100644
index 8764974..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/core/userdetails/InfrasUser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.supwisdom.infras.security.core.userdetails;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.userdetails.User;
-
-public class InfrasUser extends User {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 6535845256804630918L;
-  
-  public InfrasUser(String username, String password,
-      Collection<? extends GrantedAuthority> authorities,
-      Map<? extends String, ? extends Object> attributes) {
-    this(username, password, true, true, true, true, authorities, attributes);
-    
-  }
-
-  public InfrasUser(String username, String password, 
-      boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, 
-      Collection<? extends GrantedAuthority> authorities,
-      Map<? extends String, ? extends Object> attributes) {
-    super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
-
-    this.attributes = Collections.unmodifiableMap(attributes);
-  }
-
-  private final Map<String, Object> attributes;
-  public Map<String, Object> getAttributes() {
-    return this.attributes;
-  }
-  
-  public List<String> getRoles() {
-    List<String> roles = new ArrayList<>();
-    for (GrantedAuthority grantedAuthority : this.getAuthorities()) {
-      roles.add(grantedAuthority.getAuthority());
-    }
-    
-    return roles;
-  }
-  
-}
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
deleted file mode 100644
index 1ea28f4..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/InfrasSecurityReactiveAutoConfiguration.java
+++ /dev/null
@@ -1,66 +0,0 @@
-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/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
deleted file mode 100644
index 76cc927..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/BasicWebFluxSecurityConfiguration.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.supwisdom.infras.security.reactive.basic;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.HttpMethod;
-import org.springframework.security.config.web.server.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.reactive.enabled", havingValue="true")
-public class BasicWebFluxSecurityConfiguration {
-  
-  @Bean
-  public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
-      http
-          .securityMatcher(ServerWebExchangeMatchers.pathMatchers("/api/**"))
-          .authorizeExchange()
-              .pathMatchers(HttpMethod.OPTIONS).permitAll()
-              .pathMatchers("/api/public/**", "/api/open/**").permitAll()
-              .pathMatchers("/api/v*/public/**", "/api/v*/open/**").permitAll()
-              .pathMatchers("/api/*/v*/public/**", "/api/*/v*/open/**").permitAll()
-              .pathMatchers("/api/**").authenticated()
-              .anyExchange().authenticated();
-      
-      //http.addFilterAt(webFilter, SecurityWebFiltersOrder.LAST);
-      
-      http.httpBasic();
-      http.formLogin().disable();
-
-      http.csrf().disable();
-      
-      return http.build();
-  }
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
deleted file mode 100644
index 9658d27..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/basic/EnableInfrasBasicWebFluxApi.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.supwisdom.infras.security.reactive.basic;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.springframework.context.annotation.Import;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Import(BasicWebFluxSecurityConfiguration.class)
-public @interface EnableInfrasBasicWebFluxApi {
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/EnableInfrasJWTWebFluxApi.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/EnableInfrasJWTWebFluxApi.java
deleted file mode 100644
index 51062b2..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/EnableInfrasJWTWebFluxApi.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.supwisdom.infras.security.reactive.jwt;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.springframework.context.annotation.Import;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Import(JWTWebFluxConfiguration.class)
-public @interface EnableInfrasJWTWebFluxApi {
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTKeyController.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTKeyController.java
deleted file mode 100644
index 3c4b036..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTKeyController.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.supwisdom.infras.security.reactive.jwt;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.supwisdom.infras.security.utils.JWTTokenUtil;
-
-@RestController
-public class JWTKeyController {
-
-  @Autowired
-  private JWTTokenUtil jwtTokenUtil;
-  
-  /**
-   * curl -i -s -X GET 'http://localhost:8080/jwt/publicKey' 
-   * @return
-   */
-  @GetMapping(value = "/jwt/publicKey")
-  public String publicKey() {
-    
-    return jwtTokenUtil.getPublicKeyPem();
-  }
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTSecurityContextRepository.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTSecurityContextRepository.java
deleted file mode 100644
index bf2f6a7..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTSecurityContextRepository.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.supwisdom.infras.security.reactive.jwt;
-
-import io.jsonwebtoken.Claims;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextImpl;
-import org.springframework.security.web.server.context.ServerSecurityContextRepository;
-import org.springframework.web.server.ServerWebExchange;
-
-import com.supwisdom.infras.security.authentication.JwtAuthenticationToken;
-import com.supwisdom.infras.security.utils.JWTTokenUtil;
-
-import reactor.core.publisher.Mono;
-
-public class JWTSecurityContextRepository implements ServerSecurityContextRepository {
-  
-  private static final Logger logger = LoggerFactory.getLogger(JWTSecurityContextRepository.class);
-  
-  @Value("${infras.security.jwt.token.authorization.prefix:Bearer}")
-  private String authorizationPrefix;
-  
-  private JWTTokenUtil jwtTokenUtil;
-  
-  @Autowired
-  public JWTSecurityContextRepository(JWTTokenUtil jwtTokenUtil) {
-    this.jwtTokenUtil = jwtTokenUtil;
-  }
-
-  @Override
-  public Mono<Void> save(ServerWebExchange exchange, SecurityContext context) {
-    return Mono.empty();
-  }
-
-  @Override
-  public Mono<SecurityContext> load(ServerWebExchange exchange) {
-    
-    ServerHttpRequest request = exchange.getRequest();
-    
-    String authToken = null;
-    
-    String authParamter = request.getQueryParams().getFirst("token"); logger.debug("authParamter is [{}]", authParamter);
-    if (authParamter != null && !authParamter.isEmpty()) {
-      authToken = authParamter;
-    }
-
-    if (authToken == null) {
-      String authHeader = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); logger.debug("authHeader is [{}]", authHeader);
-      if (authHeader != null && authHeader.toLowerCase().startsWith(authorizationPrefix.toLowerCase())) {
-        authToken = authHeader.substring(authorizationPrefix.length() + 1);
-      }
-    }
-    
-    logger.debug("authToken is [{}]", authToken);
-    
-    if (authToken != null && !authToken.isEmpty()) {
-      
-      String username = getUsernameFromToken(authToken);
-      
-      if (username != null) {
-        List<GrantedAuthority> authorities = getAuthoritiesFromToken(authToken);
-        
-        Authentication authentication = new JwtAuthenticationToken(username, authToken, authorities);
-        
-        return Mono.justOrEmpty(new SecurityContextImpl(authentication));
-      }
-      
-    }
-    
-    return Mono.empty();
-  }
-  
-  
-  /**
-   * 从令牌中获取用户名
-   *
-   * @param token 令牌
-   * @return 用户名
-   */
-  private String getUsernameFromToken(String token) {
-      String username;
-      try {
-          Claims claims = jwtTokenUtil.getClaimsFromToken(token);
-          username = claims.getSubject();
-      } catch (Exception e) {
-          username = null;
-      }
-      return username;
-  }
-  
-  private List<GrantedAuthority> getAuthoritiesFromToken(String token) {
-    List<GrantedAuthority> collAuthorities = new ArrayList<GrantedAuthority>();
-    try {
-        Claims claims = jwtTokenUtil.getClaimsFromToken(token);
-        String roles = claims.get("roles", String.class);
-        
-        for (String role : roles.split(",")) {
-          collAuthorities.add(new SimpleGrantedAuthority(role));
-        }
-    } catch (Exception e) {
-      collAuthorities = new ArrayList<GrantedAuthority>();
-    }
-    return collAuthorities;
-  }
-
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTTokenController.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTTokenController.java
deleted file mode 100644
index 9a357f6..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTTokenController.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package com.supwisdom.infras.security.reactive.jwt;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.authentication.ReactiveAuthenticationManager;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
-import org.springframework.util.MimeTypeUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RestController;
-
-import reactor.core.publisher.Mono;
-
-import com.supwisdom.infras.security.configure.jwt.util.SignUtil;
-import com.supwisdom.infras.security.core.userdetails.InfrasUser;
-import com.supwisdom.infras.security.utils.JWTTokenUtil;
-
-@RestController
-public class JWTTokenController {
-  
-  private static final Logger logger = LoggerFactory.getLogger(JWTTokenController.class);
-  
-  @Value("${infras.security.jwt.token.sign.enabled:false}")
-  private boolean signEnabled;
-  @Value("${infras.security.jwt.token.sign.key:}")
-  private String signKey;
-
-  @Value("${infras.security.jwt.token.authorization.prefix:Bearer}")
-  private String authorizationPrefix;
-
-  @Autowired
-  private ReactiveAuthenticationManager reactiveAuthenticationManager;
-  @Autowired
-  private ReactiveUserDetailsService reactiveUserDetailsService;
-  @Autowired
-  private JWTTokenUtil jwtTokenUtil;
-  
-  /**
-   * 用户登录
-   * 
-   * curl -i -s -X POST 'http://localhost:8080/jwt/token/login' -d 'username=user&password=user' -H 'Content-Type: application/json'
-   *
-   * @param username 用户名
-   * @param password 密码
-   * @return 操作结果
-   * @throws AuthenticationException 错误信息
-   */
-  @PostMapping(path = "/jwt/token/login", consumes = MimeTypeUtils.APPLICATION_JSON_VALUE)
-  public Mono<String> login(
-      @RequestBody LoginRequest loginRequest
-      ) throws AuthenticationException {
-
-    return Mono.just(loginRequest).flatMap(req -> {
-      try {
-        String username = req.getUsername();
-        String password = req.getPassword();
-        
-        // TODO:判断用户的登录频次
-        
-        UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken(username, password);
-        
-        return reactiveAuthenticationManager.authenticate(upToken);
-      } catch (AuthenticationException e) {
-        // TODO: 记录失败
-        throw e;
-      }
-    }).filter(a -> a.isAuthenticated() && a.getPrincipal() instanceof InfrasUser)
-    .map(Authentication::getPrincipal)
-    .cast(InfrasUser.class)
-    .map(userDetails -> {
-      String jwtToken = generateToken(userDetails);
-      return jwtToken;
-    })
-    ;
-    
-    // 判断签名
-//    if (signEnabled) {
-//      String timestamp = request.queryParam("timestamp").get();
-//      String sign = request.queryParam("sign").get();
-//      
-//      if (timestamp == null || timestamp.isEmpty()) {
-//        throw new BadCredentialsException("timestamp error");
-//      }
-//      
-//      if (sign == null || sign.isEmpty()) {
-//        throw new BadCredentialsException("sign error");
-//      }
-//      
-//      String data = timestamp + username + password;
-//      
-//      if (!SignUtil.checkIntervalTime(timestamp, 10000)) {
-//        throw new BadCredentialsException("timestamp error");
-//      }
-//      
-//      String currentSign = SignUtil.HMACSHA1(data, signKey);
-//      if (!currentSign.equals(sign)) {
-//        throw new BadCredentialsException("sign error");
-//      }
-//    }
-    
-//    String username = loginRequest.getUsername();
-//    String password = loginRequest.getPassword();
-//
-//    // TODO:判断用户的登录频次
-//    
-//    try {
-//      UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken(username, password);
-//      
-//      Mono<String> token = 
-//      reactiveAuthenticationManager.authenticate(upToken)
-//        .filter(a -> a.isAuthenticated() && a.getPrincipal() instanceof UserDetails)
-//        .map(Authentication::getPrincipal)
-//        .cast(UserDetails.class)
-//        .map(userDetails -> {
-//          String jwtToken = generateToken(userDetails);
-//          return jwtToken;
-//        });
-//
-////      reactiveAuthenticationManager.authenticate(upToken)
-////        .filter(a -> a.isAuthenticated() && a.getPrincipal() instanceof String)
-////        .map(Authentication::getPrincipal)
-////        .cast(String.class)
-////        .map(principal -> {
-////          return reactiveUserDetailsService.findByUsername(principal)
-////            .map(userDetails -> {
-////              String jwtToken = generateToken(userDetails);
-////              return jwtToken;
-////            });
-////        });
-//      
-//      return token.block();
-//      
-////      reactiveAuthenticationManager.authenticate(upToken)
-////        .filter(a -> a.isAuthenticated() && a.getPrincipal() instanceof UserDetails)
-////        .map(Authentication::getPrincipal)
-////        .cast(UserDetails.class)
-////        .map(userDetails -> {
-////          String jwtToken = generateToken(userDetails);
-////          return jwtToken;
-////        })
-////      ;
-//
-//    } catch (AuthenticationException e) {
-//      // TODO: 记录失败
-//      throw e;
-//    }
-//
-//    //throw new UsernameNotFoundException(String.format("%s not found", username));
-  }
-  
-
-  /**
-   * 生成令牌
-   *
-   * @param userDetails 用户
-   * @return 令牌
-   */
-  private String generateToken(InfrasUser userDetails) {
-    String roles = "";
-    for (GrantedAuthority ga : userDetails.getAuthorities()) {
-      String role = ga.getAuthority();
-      roles += (roles.length() > 0 ? "," : "") + role;
-    }
-    
-    Map<String, Object> claims = new HashMap<>();
-    claims.put("sub", userDetails.getUsername());
-    claims.put("roles", roles);
-    claims.put("created", new Date());
-    return jwtTokenUtil.generateToken(claims);
-  }
-
-  
-  /**
-   * 刷新密钥
-   * 
-   * curl -i -s -X GET 'http://localhost:8080/jwt/token/refreshToken' -H 'Authorization: Bearer JWTToken'
-   *
-   * @param authorization 原密钥
-   * @return 新密钥
-   * @throws AuthenticationException 错误信息
-   */
-  @GetMapping(path = "/jwt/token/refreshToken")
-  public String refreshToken(@RequestHeader("Authorization") String authorization) throws AuthenticationException {
-    
-    if (authorization == null || !authorization.toLowerCase().startsWith(authorizationPrefix.toLowerCase())) {
-      return "authorization error";
-    }
-    
-    String token = authorization.substring(authorizationPrefix.length() + 1);
-    //if (!jwtTokenUtil.isTokenExpired(token)) {
-        return jwtTokenUtil.refreshToken(token);
-    //}
-    
-    //return "error";
-  }
-  
-  /**
-   * 注销密钥
-   * 
-   * curl -i -s -X GET 'http://localhost:8080/jwt/token/logout' -H 'Authorization: Bearer JWTToken'
-   * 
-   * @param authorization 原密钥
-   * @return
-   * @throws AuthenticationException
-   */
-  @GetMapping(path = "/jwt/token/logout")
-  public String expireToken(@RequestHeader("Authorization") String authorization) throws AuthenticationException {
-    
-    if (authorization == null || !authorization.toLowerCase().startsWith(authorizationPrefix.toLowerCase())) {
-      return "authorization error";
-    }
-    
-    String token = authorization.substring(authorizationPrefix.length() + 1);
-    
-    jwtTokenUtil.expireToken(token);
-    
-    return "success";
-  }
-  
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTWebFluxConfiguration.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTWebFluxConfiguration.java
deleted file mode 100644
index 014e483..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/JWTWebFluxConfiguration.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package com.supwisdom.infras.security.reactive.jwt;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.HttpMethod;
-import org.springframework.security.authentication.ReactiveAuthenticationManager;
-import org.springframework.security.authentication.UserDetailsRepositoryReactiveAuthenticationManager;
-import org.springframework.security.config.web.server.ServerHttpSecurity;
-import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.web.server.SecurityWebFilterChain;
-import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers;
-
-import com.supwisdom.infras.security.utils.JWTTokenUtil;
-
-@Configuration
-@ConditionalOnProperty(name="infras.security.jwt.reactive.enabled", havingValue="true")
-public class JWTWebFluxConfiguration {
-  
-  private static final Logger logger = LoggerFactory.getLogger(JWTWebFluxConfiguration.class);
-
-//  @ConditionalOnClass(RedisConnectionFactory.class)
-//  @Configuration
-//  public static class RedisStoreConfiguration {
-//    
-//    @Bean
-//    public JWTTokenRedisStore jwtTokenRedisStore(RedisConnectionFactory connectionFactory) {
-//      
-//      JWTTokenRedisStore jwtTokenRedisStore = new JWTTokenRedisStore(connectionFactory);
-//      
-//      return jwtTokenRedisStore;
-//    }
-//
-//  }
-  
-  @Autowired(required = false)
-  private ReactiveUserDetailsService reactiveUserDetailsService;
-  
-  @Autowired(required = false)
-  private PasswordEncoder passwordEncoder;
-  
-  @Bean
-  public ReactiveAuthenticationManager reactiveAuthenticationManager() {
-    if(this.reactiveUserDetailsService != null) {
-      UserDetailsRepositoryReactiveAuthenticationManager manager =
-        new UserDetailsRepositoryReactiveAuthenticationManager(this.reactiveUserDetailsService);
-      if(this.passwordEncoder != null) {
-        manager.setPasswordEncoder(this.passwordEncoder);
-      }
-      return manager;
-    }
-    return null;
-  }
-
-  @Bean
-  public JWTTokenUtil jwtTokenUtil() {
-    
-    return new JWTTokenUtil();
-  }
-
-  @Bean
-  JWTKeyController jwtKeyController() {
-    
-    JWTKeyController jwtKeyController = new JWTKeyController();
-    logger.debug("JWTWebFluxConfiguration jwtKeyController is {}", jwtKeyController);
-
-    return jwtKeyController;
-  }
-  
-  
-  
-  @Bean
-  public JWTTokenController jwtTokenController() {
-    
-    JWTTokenController jwtTokenController = new JWTTokenController();
-    logger.debug("JWTWebFluxConfiguration jwtTokenController is {}", jwtTokenController);
-    
-    return jwtTokenController;
-  }
-  
-  @Bean
-  public JWTSecurityContextRepository jwtSecurityContextRepository(JWTTokenUtil jwtTokenUtil) {
-    JWTSecurityContextRepository jwtSecurityContextRepository = new JWTSecurityContextRepository(jwtTokenUtil);
-    
-    return jwtSecurityContextRepository;
-  }
-  
-
-  @Bean
-  public SecurityWebFilterChain jwtTokenSpringSecurityFilterChain(ServerHttpSecurity http) {
-    
-    logger.debug("jwtTokenSpringSecurityFilterChain(ServerHttpSecurity)");
-  
-    http
-      .securityMatcher(ServerWebExchangeMatchers.pathMatchers("/jwt/**"))
-      .authorizeExchange()
-        .pathMatchers(HttpMethod.OPTIONS).permitAll()
-        .pathMatchers("/jwt/publicKey").permitAll()
-        .pathMatchers("/jwt/**").permitAll()
-        .anyExchange().authenticated();
-    
-    http.httpBasic().disable();
-    http.formLogin().disable();
-
-    http.csrf().disable();
-    
-    return http.build();
-  }
-
-  
-
-  @Bean
-  public SecurityWebFilterChain jwtApiSpringSecurityFilterChain(ServerHttpSecurity http) {
-      http
-          .securityMatcher(ServerWebExchangeMatchers.pathMatchers("/api/**"))
-          .authorizeExchange()
-              .pathMatchers(HttpMethod.OPTIONS).permitAll()
-              .pathMatchers("/api/public/**", "/api/open/**").permitAll()
-              .pathMatchers("/api/v*/public/**", "/api/v*/open/**").permitAll()
-              .pathMatchers("/api/*/v*/public/**", "/api/*/v*/open/**").permitAll()
-              .pathMatchers("/api/**").authenticated()
-              .anyExchange().authenticated();
-      
-      //http.addFilterAt(webFilter, SecurityWebFiltersOrder.LAST);
-      
-      http.securityContextRepository(jwtSecurityContextRepository(jwtTokenUtil()));
-      
-      http.httpBasic().disable();
-      http.formLogin().disable();
-
-      http.csrf().disable();
-
-      return http.build();
-  }
-
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/LoginRequest.java b/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/LoginRequest.java
deleted file mode 100644
index 2e47c2c..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/reactive/jwt/LoginRequest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.supwisdom.infras.security.reactive.jwt;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class LoginRequest {
-  private String username;
-  private String password;
-}
diff --git a/gateway/src/main/java/com/supwisdom/infras/security/utils/JWTTokenUtil.java b/gateway/src/main/java/com/supwisdom/infras/security/utils/JWTTokenUtil.java
deleted file mode 100644
index abbf378..0000000
--- a/gateway/src/main/java/com/supwisdom/infras/security/utils/JWTTokenUtil.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package com.supwisdom.infras.security.utils;
-
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-
-import java.io.IOException;
-import java.security.KeyPair;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.InvalidKeySpecException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.security.core.GrantedAuthority;
-//import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Component;
-
-import com.supwisdom.infras.security.cert.CertUtil;
-import com.supwisdom.infras.security.token.store.redis.JWTTokenRedisStore;
-
-@Component
-public class JWTTokenUtil implements InitializingBean {
-
-  private static final Logger logger = LoggerFactory.getLogger(JWTTokenUtil.class);
-  
-  private static ConcurrentMap<String, Long> mapTokenExpiration = new ConcurrentHashMap<String, Long>();
-  
-  @Autowired(required = false)
-  private JWTTokenRedisStore redisTokenStore;
-
-  /**
-   * 密钥
-   */
-  //@Value("${infras.security.jwt.secret:MyJwtSecret}")
-  //private String secret;
-  
-
-  @Value("${infras.security.jwt.iss:supwisdom}")
-  private String issuer;
-  @Value("${infras.security.jwt.jti:supwisdom-jwt}")
-  private String jti;
-
-
-  @Value("${infras.security.jwt.expiration:2592000}")
-  private Long expiration;
-  
-  @Value("${infras.security.jwt.kickout.enabled:false}")
-  private boolean kickoutEnabled;
-  
-
-  @Value("${infras.security.jwt.key-alias:supwisdom-jwt-key}")
-  private String keyAlias;
-  @Value("${infras.security.jwt.key-password:kingstar}")
-  private String keyPassword;
-
-  @Value("${infras.security.jwt.key-store:}")
-  private String keyStore;
-  @Value("${infras.security.jwt.key-store-password:kingstar}")
-  private String keyStorePassword;
-  
-  
-  @Value("${infras.security.jwt.public-key-pem:}")
-  private String publicKeyPem;
-  @Value("${infras.security.jwt.private-key-pem-pkcs8:}")
-  private String privateKeyPemPKCS8;
-
-  @Override
-  public void afterPropertiesSet() throws Exception {
-    this.initKey();
-  }
-
-  private KeyPair keyPair;
-  
-  public void initKey() {
-    
-    try {
-      this.keyPair = CertUtil.initKeyFromPem(publicKeyPem, privateKeyPemPKCS8);
-      logger.debug("init keyPair from pem");
-      return;
-    } catch (NoSuchAlgorithmException e) {
-      e.printStackTrace();
-    } catch (InvalidKeySpecException e) {
-      e.printStackTrace();
-    }
-    
-    try {
-      this.keyPair = CertUtil.initKeyFromKeyStore(keyStore, keyStorePassword, keyAlias, keyPassword);
-      logger.debug("init keyPair from keyStore");
-    } catch (UnrecoverableKeyException e) {
-      e.printStackTrace();
-    } catch (KeyStoreException e) {
-      e.printStackTrace();
-    } catch (CertificateException e) {
-      e.printStackTrace();
-    } catch (IOException e) {
-      e.printStackTrace();
-    } catch (NoSuchAlgorithmException e) {
-      e.printStackTrace();
-    }
-    
-  }
-  
-  public RSAPublicKey getPublicKey() {
-    return (RSAPublicKey) this.keyPair.getPublic();
-  }
-  
-  public RSAPrivateKey getPrivateKey() {
-    return (RSAPrivateKey) this.keyPair.getPrivate();
-  }
-  
-  public String getPublicKeyPem() {
-    return CertUtil.publicKeyToPem(getPublicKey());
-  }
-
-  private void storeTokenExpiration(String token, Long expiration) {
-    if (!kickoutEnabled) {
-      return;
-    }
-    
-    logger.debug("store <token, expiration> to Map");
-    mapTokenExpiration.put(token, expiration);  // FIXME: 存储到 redis 或 数据库
-
-    if (redisTokenStore != null) {
-      logger.debug("store <token, expiration> to Redis");
-      redisTokenStore.storeTokenExpiration(token, expiration);
-    }
-  }
-  
-  private Long loadTokenExpiration(String token) {
-    if (!kickoutEnabled) {
-      return Long.MAX_VALUE;
-    }
-    
-    if (redisTokenStore != null) {
-      logger.debug("load <token, expiration> from Redis");
-      return redisTokenStore.loadTokenExpiration(token, -1L);
-    }
-    
-    logger.debug("load <token, expiration> from Map");
-    return mapTokenExpiration.getOrDefault(token, -1L);  // FIXME: 存储到 redis 或 数据库
-  }
-
-  /**
-   * 从数据声明生成令牌
-   *
-   * @param claims 数据声明
-   * @return 令牌
-   */
-  public String generateToken(Map<String, Object> claims) {
-      Date expirationDate = new Date(System.currentTimeMillis() + expiration * 1000);
-      String token = Jwts.builder()
-          .setClaims(claims)
-          .setIssuer(issuer)
-          .setId(jti)
-          .setIssuedAt(new Date(System.currentTimeMillis()))
-          .setExpiration(expirationDate)
-          .signWith(SignatureAlgorithm.RS512, this.getPrivateKey())
-          .compact();
-      
-      storeTokenExpiration(token, expirationDate.getTime());
-      
-      return token;
-  }
-
-  /**
-   * 从令牌中获取数据声明
-   *
-   * @param token 令牌
-   * @return 数据声明
-   */
-  public Claims getClaimsFromToken(String token) {
-      Claims claims;
-      try {
-          claims = Jwts.parser().setSigningKey(this.getPublicKey()).parseClaimsJws(token).getBody();
-      } catch (Exception e) {
-          claims = null;
-      }
-      return claims;
-  }
-
-  /**
-   * 判断令牌是否过期
-   *
-   * @param token 令牌
-   * @return 是否过期
-   */
-  public Boolean isTokenExpired(String token) {
-      try {
-          Claims claims = getClaimsFromToken(token);
-          Date expiration = claims.getExpiration();
-          
-          Date now = new Date();
-          
-          // 判断存储中的 token 是否过期
-          Long expirationTimeMillis = loadTokenExpiration(token);
-          if (expirationTimeMillis < now.getTime()) {
-            return true;
-          }
-          
-          return expiration.before(now);
-      } catch (Exception e) {
-          return false; // FIXME: ?
-      }
-  }
-
-  /**
-   * 刷新令牌
-   *
-   * @param token 原令牌
-   * @return 新令牌
-   */
-  public String refreshToken(String token) {
-      String refreshedToken;
-      try {
-          Claims claims = getClaimsFromToken(token);
-          claims.put("created", new Date());
-          refreshedToken = generateToken(claims);
-      } catch (Exception e) {
-          refreshedToken = null;
-      }
-      return refreshedToken;
-  }
-
-  /**
-   * 验证令牌
-   *
-   * @param token       令牌
-   * @param userDetails 用户
-   * @return 是否有效
-   */
-  public Boolean validateToken(String token, String username) {
-    Claims claims = getClaimsFromToken(token);
-    String sub = claims.getSubject();
-    
-    return (sub.equals(username) && !isTokenExpired(token));
-  }
-
-  /**
-   * 踢出令牌
-   * @param token
-   */
-  public void expireToken(String token) {
-      if (!isTokenExpired(token)) {
-          storeTokenExpiration(token, -1L);
-      }
-  }
-
-}
diff --git a/gateway/src/main/resources/META-INF/spring.factories b/gateway/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 9a872fd..0000000
--- a/gateway/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,3 +0,0 @@
-# Auto Configure
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-com.supwisdom.infras.security.reactive.InfrasSecurityReactiveAutoConfiguration
\ No newline at end of file