Skip to content

Commit 9c03b6f

Browse files
committed
Spring Security form login only offers application/json req body type. fixes #1931
1 parent 42b76f9 commit 9c03b6f

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityConfiguration.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import io.swagger.v3.oas.models.parameters.RequestBody;
3939
import io.swagger.v3.oas.models.responses.ApiResponse;
4040
import io.swagger.v3.oas.models.responses.ApiResponses;
41+
import org.apache.commons.lang3.reflect.FieldUtils;
4142
import org.slf4j.Logger;
4243
import org.slf4j.LoggerFactory;
4344
import org.springdoc.core.customizers.OpenApiCustomizer;
@@ -58,6 +59,7 @@
5859
import org.springframework.security.web.SecurityFilterChain;
5960
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
6061
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
62+
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
6163
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
6264
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
6365

@@ -110,13 +112,31 @@ OpenApiCustomizer springSecurityLoginEndpointCustomiser(ApplicationContext appli
110112
.filter(UsernamePasswordAuthenticationFilter.class::isInstance)
111113
.map(UsernamePasswordAuthenticationFilter.class::cast)
112114
.findAny();
115+
Optional<DefaultLoginPageGeneratingFilter> optionalDefaultLoginPageGeneratingFilter =
116+
filterChain.getFilters().stream()
117+
.filter(DefaultLoginPageGeneratingFilter.class::isInstance)
118+
.map(DefaultLoginPageGeneratingFilter.class::cast)
119+
.findAny();
113120
if (optionalFilter.isPresent()) {
114121
UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter = optionalFilter.get();
115122
Operation operation = new Operation();
116123
Schema<?> schema = new ObjectSchema()
117124
.addProperty(usernamePasswordAuthenticationFilter.getUsernameParameter(), new StringSchema())
118125
.addProperty(usernamePasswordAuthenticationFilter.getPasswordParameter(), new StringSchema());
119-
RequestBody requestBody = new RequestBody().content(new Content().addMediaType(org.springframework.http.MediaType.APPLICATION_JSON_VALUE, new MediaType().schema(schema)));
126+
String mediaType = org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
127+
if(optionalDefaultLoginPageGeneratingFilter.isPresent()){
128+
DefaultLoginPageGeneratingFilter defaultLoginPageGeneratingFilter = optionalDefaultLoginPageGeneratingFilter.get();
129+
Field formLoginEnabledField = FieldUtils.getDeclaredField(DefaultLoginPageGeneratingFilter.class, "formLoginEnabled", true);
130+
try {
131+
boolean formLoginEnabled = (boolean) formLoginEnabledField.get(defaultLoginPageGeneratingFilter);
132+
if(formLoginEnabled)
133+
mediaType = org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE;
134+
}
135+
catch (IllegalAccessException e) {
136+
LOGGER.warn(e.getMessage());
137+
}
138+
}
139+
RequestBody requestBody = new RequestBody().content(new Content().addMediaType(mediaType, new MediaType().schema(schema)));
120140
operation.requestBody(requestBody);
121141
ApiResponses apiResponses = new ApiResponses();
122142
apiResponses.addApiResponse(String.valueOf(HttpStatus.OK.value()), new ApiResponse().description(HttpStatus.OK.getReasonPhrase()));

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

Lines changed: 1 addition & 1 deletion
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": {

0 commit comments

Comments
 (0)