Skip to content

Commit 46483c9

Browse files
authored
Merge pull request #1430 from lipniak/security-add-custom-paths
springdoc-openapi-security: support custom login processing endpoints
2 parents 5787a07 + f63a3e9 commit 46483c9

File tree

4 files changed

+105
-1
lines changed

4 files changed

+105
-1
lines changed

Diff for: springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package org.springdoc.security;
2222

23+
import java.lang.reflect.Field;
2324
import java.util.Optional;
2425

2526
import io.swagger.v3.oas.models.Operation;
@@ -48,8 +49,10 @@
4849
import org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping;
4950
import org.springframework.security.web.FilterChainProxy;
5051
import org.springframework.security.web.SecurityFilterChain;
52+
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
5153
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
5254
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
55+
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
5356

5457
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
5558
import static org.springdoc.core.Constants.SPRINGDOC_SHOW_LOGIN_ENDPOINT;
@@ -131,7 +134,15 @@ OpenApiCustomiser springSecurityLoginEndpointCustomiser(ApplicationContext appli
131134
operation.responses(apiResponses);
132135
operation.addTagsItem("login-endpoint");
133136
PathItem pathItem = new PathItem().post(operation);
134-
openAPI.getPaths().addPathItem("/login", pathItem);
137+
try {
138+
Field requestMatcherField = AbstractAuthenticationProcessingFilter.class.getDeclaredField("requiresAuthenticationRequestMatcher");
139+
requestMatcherField.setAccessible(true);
140+
AntPathRequestMatcher requestMatcher = (AntPathRequestMatcher) requestMatcherField.get(usernamePasswordAuthenticationFilter);
141+
String loginPath = requestMatcher.getPattern();
142+
requestMatcherField.setAccessible(false);
143+
openAPI.getPaths().addPathItem(loginPath, pathItem);
144+
} catch (NoSuchFieldException | IllegalAccessException | ClassCastException ignored) {
145+
}
135146
}
136147
}
137148
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package test.org.springdoc.api.app8;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import io.swagger.v3.oas.models.info.Info;
5+
import io.swagger.v3.oas.models.info.License;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.test.context.TestPropertySource;
9+
import test.org.springdoc.api.AbstractSpringDocTest;
10+
11+
@TestPropertySource(properties = "springdoc.show-login-endpoint=true")
12+
public class SpringDocApp8Test extends AbstractSpringDocTest {
13+
14+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app8" })
15+
static class SpringDocTestApp {
16+
@Bean
17+
public OpenAPI customOpenAPI() {
18+
return new OpenAPI()
19+
.info(new Info().title("Security API").version("v1")
20+
.license(new License().name("Apache 2.0").url("http://springdoc.org")));
21+
}
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package test.org.springdoc.api.app8.security;
2+
3+
import org.springframework.core.annotation.Order;
4+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
5+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
6+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
7+
8+
@EnableWebSecurity
9+
@Order(200)
10+
public class WebConfig extends WebSecurityConfigurerAdapter {
11+
12+
@Override
13+
protected void configure(HttpSecurity http) throws Exception {
14+
http.formLogin()
15+
.loginProcessingUrl("/api/login");
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "Security API",
5+
"license": {
6+
"name": "Apache 2.0",
7+
"url": "http://springdoc.org"
8+
},
9+
"version": "v1"
10+
},
11+
"servers": [
12+
{
13+
"url": "http://localhost",
14+
"description": "Generated server url"
15+
}
16+
],
17+
"paths": {
18+
"/api/login": {
19+
"post": {
20+
"tags": [
21+
"login-endpoint"
22+
],
23+
"requestBody": {
24+
"content": {
25+
"application/json": {
26+
"schema": {
27+
"type": "object",
28+
"properties": {
29+
"username": {
30+
"type": "string"
31+
},
32+
"password": {
33+
"type": "string"
34+
}
35+
}
36+
}
37+
}
38+
}
39+
},
40+
"responses": {
41+
"200": {
42+
"description": "OK"
43+
},
44+
"403": {
45+
"description": "Forbidden"
46+
}
47+
}
48+
}
49+
}
50+
},
51+
"components": {
52+
}
53+
}

0 commit comments

Comments
 (0)