Skip to content

Commit b709edf

Browse files
committed
Spring Security form login only offers application/json req body type. fixes #1931
1 parent 1e64c20 commit b709edf

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.swagger.v3.oas.models.parameters.RequestBody;
3636
import io.swagger.v3.oas.models.responses.ApiResponse;
3737
import io.swagger.v3.oas.models.responses.ApiResponses;
38+
import org.apache.commons.lang3.reflect.FieldUtils;
3839
import org.slf4j.Logger;
3940
import org.slf4j.LoggerFactory;
4041
import org.springdoc.core.SpringDocConfiguration;
@@ -56,6 +57,7 @@
5657
import org.springframework.security.web.SecurityFilterChain;
5758
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
5859
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
60+
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
5961
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
6062
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
6163

@@ -132,13 +134,31 @@ OpenApiCustomiser springSecurityLoginEndpointCustomiser(ApplicationContext appli
132134
.filter(UsernamePasswordAuthenticationFilter.class::isInstance)
133135
.map(UsernamePasswordAuthenticationFilter.class::cast)
134136
.findAny();
137+
Optional<DefaultLoginPageGeneratingFilter> optionalDefaultLoginPageGeneratingFilter =
138+
filterChain.getFilters().stream()
139+
.filter(DefaultLoginPageGeneratingFilter.class::isInstance)
140+
.map(DefaultLoginPageGeneratingFilter.class::cast)
141+
.findAny();
135142
if (optionalFilter.isPresent()) {
136143
UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter = optionalFilter.get();
137144
Operation operation = new Operation();
138145
Schema<?> schema = new ObjectSchema()
139146
.addProperty(usernamePasswordAuthenticationFilter.getUsernameParameter(), new StringSchema())
140147
.addProperty(usernamePasswordAuthenticationFilter.getPasswordParameter(), new StringSchema());
141-
RequestBody requestBody = new RequestBody().content(new Content().addMediaType(org.springframework.http.MediaType.APPLICATION_JSON_VALUE, new MediaType().schema(schema)));
148+
String mediaType = org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
149+
if(optionalDefaultLoginPageGeneratingFilter.isPresent()){
150+
DefaultLoginPageGeneratingFilter defaultLoginPageGeneratingFilter = optionalDefaultLoginPageGeneratingFilter.get();
151+
Field formLoginEnabledField = FieldUtils.getDeclaredField(DefaultLoginPageGeneratingFilter.class, "formLoginEnabled", true);
152+
try {
153+
boolean formLoginEnabled = (boolean) formLoginEnabledField.get(defaultLoginPageGeneratingFilter);
154+
if(formLoginEnabled)
155+
mediaType = org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE;
156+
}
157+
catch (IllegalAccessException e) {
158+
LOGGER.warn(e.getMessage());
159+
}
160+
}
161+
RequestBody requestBody = new RequestBody().content(new Content().addMediaType(mediaType, new MediaType().schema(schema)));
142162
operation.requestBody(requestBody);
143163
ApiResponses apiResponses = new ApiResponses();
144164
apiResponses.addApiResponse(String.valueOf(HttpStatus.OK.value()), new ApiResponse().description(HttpStatus.OK.getReasonPhrase()));

springdoc-openapi-security/src/test/resources/results/app8.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
],
2323
"requestBody": {
2424
"content": {
25-
"application/json": {
25+
"application/x-www-form-urlencoded": {
2626
"schema": {
2727
"type": "object",
2828
"properties": {
@@ -48,6 +48,5 @@
4848
}
4949
}
5050
},
51-
"components": {
52-
}
51+
"components": {}
5352
}

0 commit comments

Comments
 (0)