diff --git a/README.md b/README.md index 5a98b4a..e214dd6 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ - Docker Compose - CI/CD (Github Actions) - Postman +- Spring Boot Open Api ### Postman @@ -148,6 +149,11 @@ Import postman collection under postman_collection folder ``` +### Open Api + +``` +http://localhost:1225/swagger-ui/index.html +``` ### Prerequisites diff --git a/pom.xml b/pom.xml index a2e6dbd..e5aceab 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,8 @@ 0.12.3 1.5.5.Final 0.2.0 + 2.1.0 + 2.1.0 @@ -160,6 +162,18 @@ test + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${openapi.version} + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc-openapi.version} + + diff --git a/src/main/java/com/security/rolepermissionexample/auth/config/SecurityConfig.java b/src/main/java/com/security/rolepermissionexample/auth/config/SecurityConfig.java index 2375dfa..18a3440 100644 --- a/src/main/java/com/security/rolepermissionexample/auth/config/SecurityConfig.java +++ b/src/main/java/com/security/rolepermissionexample/auth/config/SecurityConfig.java @@ -65,6 +65,12 @@ public SecurityFilterChain filterChain( .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(customizer -> customizer .requestMatchers(HttpMethod.POST, "/api/v1/authentication/**").permitAll() + .requestMatchers( + "/swagger-ui/**", + "/swagger-ui.html", + "/v2/api-docs/**", + "/v3/api-docs/**" + ).permitAll() .anyRequest().authenticated() ) .sessionManagement(customizer -> customizer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) diff --git a/src/main/java/com/security/rolepermissionexample/common/config/OpenApiConfig.java b/src/main/java/com/security/rolepermissionexample/common/config/OpenApiConfig.java new file mode 100644 index 0000000..31bd25e --- /dev/null +++ b/src/main/java/com/security/rolepermissionexample/common/config/OpenApiConfig.java @@ -0,0 +1,35 @@ +package com.security.rolepermissionexample.common.config; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.security.SecurityScheme; + +/** + * Configuration class named {@link OpenApiConfig} for OpenAPI documentation. + */ +@OpenAPIDefinition( + info = @Info( + contact = @Contact( + name = "Sercan Noyan Germiyanoğlu", + url = "https://github.com/Rapter1990/parkinglot/" + ), + description = "Case Study - Role Permission Through Spring Security in Spring Boot" + + "(Spring Boot, Spring Security , Mysql, JUnit, Integration Test, Docker, Test Container, Github Actions, Postman) ", + title = "rolepermissionexample", + version = "1.0.0" + ) +) +@SecurityScheme( + name = "bearerAuth", + description = "JWT Token", + scheme = "bearer", + type = SecuritySchemeType.HTTP, + bearerFormat = "JWT", + in = SecuritySchemeIn.HEADER +) +public class OpenApiConfig { + +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 1ff5bed..6b34122 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -23,3 +23,10 @@ spring: sql: init: mode: always + + +# SWAGGER +springdoc: + api-docs: + enabled: true + show-actuator: true diff --git a/src/test/java/com/security/rolepermissionexample/common/config/OpenApiConfigTest.java b/src/test/java/com/security/rolepermissionexample/common/config/OpenApiConfigTest.java new file mode 100644 index 0000000..c9a1d6d --- /dev/null +++ b/src/test/java/com/security/rolepermissionexample/common/config/OpenApiConfigTest.java @@ -0,0 +1,59 @@ +package com.security.rolepermissionexample.common.config; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.security.SecurityScheme; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class OpenApiConfigTest { + + @Test + void openApiInfo() { + + // Given + OpenAPIDefinition openAPIDefinition = OpenApiConfig.class.getAnnotation(OpenAPIDefinition.class); + + // Then + assertEquals("1.0.0", openAPIDefinition.info().version()); + assertEquals("rolepermissionexample", openAPIDefinition.info().title()); + assertEquals("Case Study - Role Permission Through Spring Security in Spring Boot" + + "(Spring Boot, Spring Security , Mysql, JUnit, Integration Test, Docker, Test Container, Github Actions, Postman) ", + openAPIDefinition.info().description()); + + } + + @Test + void securityScheme() { + + // Given + SecurityScheme securityScheme = OpenApiConfig.class.getAnnotation(SecurityScheme.class); + + // Then + assertEquals("bearerAuth", securityScheme.name()); + assertEquals("JWT Token", securityScheme.description()); + assertEquals("bearer", securityScheme.scheme()); + assertEquals(SecuritySchemeType.HTTP, securityScheme.type()); + assertEquals("JWT", securityScheme.bearerFormat()); + assertEquals(SecuritySchemeIn.HEADER, securityScheme.in()); + + } + + @Test + void contactInfo() { + + // Given + Info info = OpenApiConfig.class.getAnnotation(OpenAPIDefinition.class).info(); + Contact contact = info.contact(); + + // Then + assertEquals("Sercan Noyan Germiyanoğlu", contact.name()); + assertEquals("https://github.com/Rapter1990/parkinglot/", contact.url()); + + } + +} \ No newline at end of file