diff --git a/pom.xml b/pom.xml index d12ce13..5a9b531 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,13 @@ org.springframework.boot spring-boot-starter-webflux + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + diff --git a/src/main/java/com/satwik/splitora/SplitoraApplication.java b/src/main/java/com/satwik/splitora/SplitoraApplication.java index 6cedd9d..842b409 100644 --- a/src/main/java/com/satwik/splitora/SplitoraApplication.java +++ b/src/main/java/com/satwik/splitora/SplitoraApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; @SpringBootApplication +@EnableWebMvc public class SplitoraApplication { public static void main(String[] args) { diff --git a/src/main/java/com/satwik/splitora/configuration/filter/SecurityFilter.java b/src/main/java/com/satwik/splitora/configuration/filter/SecurityFilter.java index e982750..6a9562c 100644 --- a/src/main/java/com/satwik/splitora/configuration/filter/SecurityFilter.java +++ b/src/main/java/com/satwik/splitora/configuration/filter/SecurityFilter.java @@ -2,6 +2,7 @@ import com.satwik.splitora.configuration.jwt.JwtUtil; import com.satwik.splitora.configuration.security.LoggedInUser; +import com.satwik.splitora.constants.SecurityConstants; import com.satwik.splitora.repository.UserRepository; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -18,22 +19,11 @@ import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; -import java.util.*; @Slf4j @Component public class SecurityFilter extends OncePerRequestFilter { - private static final List WHITELISTED_URLS = new ArrayList<>(Arrays.asList( - "/api/v1/auth/login", - "/api/v1/auth/refresh_token", - "/api/v1/user/register", - "/api/v1/oauth2/login", - "/api/v1/oauth2/callback", - "/api/v1/auth/getUser" - - )); // Add your whitelisted URLs here - @Autowired UserRepository userRepository; @@ -47,7 +37,7 @@ public class SecurityFilter extends OncePerRequestFilter { private LoggedInUser loggedInUser; private boolean isWhitelisted(String url) { - return WHITELISTED_URLS.stream().anyMatch(url::contains); + return SecurityConstants.WHITELISTED_URLS.stream().anyMatch(url::contains); } @Override diff --git a/src/main/java/com/satwik/splitora/configuration/security/SecurityConfiguration.java b/src/main/java/com/satwik/splitora/configuration/security/SecurityConfiguration.java index 02bd582..7ae5e2e 100644 --- a/src/main/java/com/satwik/splitora/configuration/security/SecurityConfiguration.java +++ b/src/main/java/com/satwik/splitora/configuration/security/SecurityConfiguration.java @@ -52,6 +52,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers(HttpMethod.GET, "/api/v1/oauth2/callback**").permitAll() .requestMatchers(HttpMethod.HEAD, "/api/v1/health/ping").permitAll() .requestMatchers(HttpMethod.GET, "/api/v1/health/ping").permitAll() + .requestMatchers(HttpMethod.GET, "/v3/api-docs/**").permitAll() + .requestMatchers(HttpMethod.GET, "/swagger-ui/**").permitAll() .anyRequest().authenticated() ).addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class); diff --git a/src/main/java/com/satwik/splitora/configuration/tools/SwaggerConfiguration.java b/src/main/java/com/satwik/splitora/configuration/tools/SwaggerConfiguration.java new file mode 100644 index 0000000..424d357 --- /dev/null +++ b/src/main/java/com/satwik/splitora/configuration/tools/SwaggerConfiguration.java @@ -0,0 +1,37 @@ +package com.satwik.splitora.configuration.tools; + +import com.satwik.splitora.constants.SecurityConstants; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import org.springdoc.core.customizers.OpenApiCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfiguration { + + @Bean + public OpenAPI customOpenAPI() { + + return new OpenAPI() + .info(new io.swagger.v3.oas.models.info.Info() + .title("Splitora API") + .version("1.0") + .description("API documentation for Splitora application")); + } + + @Bean + public OpenApiCustomizer openApiCustomizer() { + + final String securitySchemeName = "bearerAuth"; + + return openApi -> + openApi.getPaths().forEach((s, pathItem) -> { + boolean isSecured = SecurityConstants.WHITELISTED_URLS.stream().noneMatch(s::contains); + if (isSecured) { + pathItem.readOperations().forEach(operation -> + operation.addSecurityItem(new SecurityRequirement().addList(securitySchemeName))); + } + }); + } +} diff --git a/src/main/java/com/satwik/splitora/constants/SecurityConstants.java b/src/main/java/com/satwik/splitora/constants/SecurityConstants.java new file mode 100644 index 0000000..e001d78 --- /dev/null +++ b/src/main/java/com/satwik/splitora/constants/SecurityConstants.java @@ -0,0 +1,19 @@ +package com.satwik.splitora.constants; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SecurityConstants { + public static final List WHITELISTED_URLS = new ArrayList<>(Arrays.asList( + "/api/v1/auth/login", + "/api/v1/auth/refresh_token", + "/api/v1/user/register", + "/api/v1/auth/getUser", + "/api/v1/oauth2/login", + "/api/v1/oauth2/callback", + "/api/v1/health/ping", + "/v3/api-docs/**", + "/swagger-ui/**" + )); +}