diff --git a/src/main/java/com/kt/ShoppingApplication.java b/src/main/java/com/kt/ShoppingApplication.java index 69b7ddc..6836722 100644 --- a/src/main/java/com/kt/ShoppingApplication.java +++ b/src/main/java/com/kt/ShoppingApplication.java @@ -3,11 +3,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication @ConfigurationPropertiesScan @EnableJpaAuditing +@EnableAspectJAutoProxy public class ShoppingApplication { public static void main(String[] args) { diff --git a/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java b/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java index 364d193..4b26b1b 100644 --- a/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java +++ b/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java @@ -19,11 +19,13 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Aspect @Component @RequiredArgsConstructor @Slf4j +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitAspect { private final RateLimitManager rateLimitManager; diff --git a/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java b/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java index 47393e2..24544b7 100644 --- a/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java +++ b/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java @@ -19,9 +19,11 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Slf4j @Component +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class GlobalRateLimitFilter extends OncePerRequestFilter { private static final int MAX_REQUEST_SECONDS = 100; diff --git a/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java b/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java index 7108df7..eea89ea 100644 --- a/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java +++ b/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java @@ -12,9 +12,11 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Component @Slf4j +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitKeyGenerator { public String generateKey(KeyType keyType, HttpServletRequest request, String httpMethod, String path) { diff --git a/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java b/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java index 624e492..f987c7f 100644 --- a/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java +++ b/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java @@ -12,10 +12,12 @@ import io.github.bucket4j.distributed.proxy.ProxyManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Component @RequiredArgsConstructor @Slf4j +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitManager { private final ProxyManager proxyManager; diff --git a/src/main/java/com/kt/config/RateLimitConfiguration.java b/src/main/java/com/kt/config/RateLimitConfiguration.java index ffd9395..c6380f5 100644 --- a/src/main/java/com/kt/config/RateLimitConfiguration.java +++ b/src/main/java/com/kt/config/RateLimitConfiguration.java @@ -3,9 +3,9 @@ import java.time.Duration; import java.util.concurrent.TimeUnit; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.EnableAspectJAutoProxy; import com.github.benmanes.caffeine.cache.Caffeine; @@ -13,7 +13,7 @@ import io.github.bucket4j.distributed.proxy.ProxyManager; @Configuration -@EnableAspectJAutoProxy +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitConfiguration { private static final int CACHE_MAX_SIZE = 100000; diff --git a/src/main/java/com/kt/config/SecurityConfiguration.java b/src/main/java/com/kt/config/SecurityConfiguration.java index a6a03a0..188feb0 100644 --- a/src/main/java/com/kt/config/SecurityConfiguration.java +++ b/src/main/java/com/kt/config/SecurityConfiguration.java @@ -18,13 +18,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity @EnableMethodSecurity -@RequiredArgsConstructor public class SecurityConfiguration { private static final String[] GET_PERMIT_ALL = {"/api/health/**", "/swagger-ui.html","/swagger-ui/**", "/v3/api-docs/**", "/actuator/**", "/payment-*.html", "/api/payments/client-key", "/*.css", "/api/chats", "/api/chats/**"}; @@ -36,6 +35,16 @@ public class SecurityConfiguration { private final ObjectMapper objectMapper; private final GlobalRateLimitFilter globalRateLimitFilter; + public SecurityConfiguration( + JwtTokenProvider jwtTokenProvider, + ObjectMapper objectMapper, + @Autowired(required = false) GlobalRateLimitFilter globalRateLimitFilter + ) { + this.jwtTokenProvider = jwtTokenProvider; + this.objectMapper = objectMapper; + this.globalRateLimitFilter = globalRateLimitFilter; + } + @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -69,7 +78,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .logout(logout -> logout.disable()) .csrf(AbstractHttpConfigurer::disable); - http.addFilterBefore(globalRateLimitFilter, UsernamePasswordAuthenticationFilter.class); + if (globalRateLimitFilter != null) { + http.addFilterBefore(globalRateLimitFilter, UsernamePasswordAuthenticationFilter.class); + } http.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider,objectMapper), UsernamePasswordAuthenticationFilter.class); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4dc09b4..bb08686 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,4 +20,7 @@ slack: log-channel: ${slack.channel} server: - port: 8080 \ No newline at end of file + port: 8080 + +ratelimit: + enabled: true \ No newline at end of file