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