Skip to content

Commit de8a7ec

Browse files
committed
Add Security Schema by AutoConfigure. Fixes #2780
1 parent 3708d7a commit de8a7ec

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed

Diff for: springdoc-openapi-starter-common/src/main/java/org/springdoc/core/customizers/SpecPropertiesCustomizer.java

+92
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
import io.swagger.v3.oas.models.info.Info;
4242
import io.swagger.v3.oas.models.info.License;
4343
import io.swagger.v3.oas.models.media.Schema;
44+
import io.swagger.v3.oas.models.security.OAuthFlows;
45+
import io.swagger.v3.oas.models.security.SecurityRequirement;
46+
import io.swagger.v3.oas.models.security.SecurityScheme;
47+
import io.swagger.v3.oas.models.security.SecurityScheme.In;
48+
import io.swagger.v3.oas.models.security.SecurityScheme.Type;
4449
import org.apache.commons.lang3.StringUtils;
4550
import org.springdoc.core.properties.SpringDocConfigProperties;
4651

@@ -134,6 +139,31 @@ private void customizeOpenApi(OpenAPI openApi, OpenAPI openApiProperties) {
134139
Paths pathsProperties = openApiProperties.getPaths();
135140
if (pathsProperties != null)
136141
customizePaths(openApi, pathsProperties);
142+
143+
List<SecurityRequirement> securityRequirementsProperties = openApiProperties.getSecurity();
144+
if (!CollectionUtils.isEmpty(securityRequirementsProperties)) {
145+
customizeSecurity(openApi, securityRequirementsProperties);
146+
}
147+
}
148+
}
149+
150+
/**
151+
* Customize security.
152+
*
153+
* @param openApi the open api
154+
* @param securityRequirementsProperties the security requirements
155+
*/
156+
private void customizeSecurity(OpenAPI openApi, List<SecurityRequirement> securityRequirementsProperties) {
157+
List<SecurityRequirement> securityRequirements = openApi.getSecurity();
158+
if (CollectionUtils.isEmpty(securityRequirements)) {
159+
openApi.setSecurity(securityRequirementsProperties);
160+
}
161+
else {
162+
securityRequirementsProperties.forEach(securityRequirement -> {
163+
if (!securityRequirements.contains(securityRequirement)) {
164+
securityRequirements.add(securityRequirement);
165+
}
166+
});
137167
}
138168
}
139169

@@ -204,6 +234,28 @@ private void customizeComponents(OpenAPI openApi, Components componentsPropertie
204234
});
205235
}
206236
});
237+
238+
239+
Map<String, SecurityScheme> securitySchemeMap = components.getSecuritySchemes();
240+
if (CollectionUtils.isEmpty(securitySchemeMap)) {
241+
components.setSecuritySchemes(componentsProperties.getSecuritySchemes());
242+
}
243+
else {
244+
securitySchemeMap.forEach((key, securityScheme) -> {
245+
SecurityScheme securitySchemeToCustomize = components.getSecuritySchemes().get(key);
246+
if (securitySchemeToCustomize != null) {
247+
resolveString(securitySchemeToCustomize::description, securityScheme::getDescription);
248+
resolveString(securitySchemeToCustomize::name, securityScheme::getName);
249+
resolveType(securitySchemeToCustomize::type, securityScheme::getType);
250+
resolveIn(securitySchemeToCustomize::in, securityScheme::getIn);
251+
resolveString(securitySchemeToCustomize::scheme, securityScheme::getScheme);
252+
resolveString(securitySchemeToCustomize::bearerFormat, securityScheme::getBearerFormat);
253+
resolveString(securitySchemeToCustomize::openIdConnectUrl, securityScheme::getOpenIdConnectUrl);
254+
resolveOAuthFlows(securitySchemeToCustomize::flows, securityScheme::getFlows);
255+
resolveString(securitySchemeToCustomize::$ref, securityScheme::get$ref);
256+
}
257+
});
258+
}
207259
}
208260
}
209261

@@ -259,6 +311,46 @@ private void resolveString(Consumer<String> setter, Supplier<Object> getter) {
259311
}
260312
}
261313

314+
/**
315+
* Resolve type.
316+
*
317+
* @param setter the setter
318+
* @param getter the getter
319+
*/
320+
private void resolveType(Consumer<Type> setter, Supplier<Object> getter) {
321+
Type value = (Type) getter.get();
322+
if (value!=null) {
323+
setter.accept(value);
324+
}
325+
}
326+
327+
/**
328+
* Resolve in.
329+
*
330+
* @param setter the setter
331+
* @param getter the getter
332+
*/
333+
private void resolveIn(Consumer<In> setter, Supplier<Object> getter) {
334+
In value = (In) getter.get();
335+
if (value!=null) {
336+
setter.accept(value);
337+
}
338+
}
339+
340+
/**
341+
* Resolve o auth flows.
342+
*
343+
* @param setter the setter
344+
* @param getter the getter
345+
*/
346+
private void resolveOAuthFlows(Consumer<OAuthFlows> setter, Supplier<Object> getter) {
347+
OAuthFlows value = (OAuthFlows) getter.get();
348+
if (value!=null) {
349+
setter.accept(value);
350+
}
351+
}
352+
353+
262354
/**
263355
* Resolve set.
264356
*

Diff for: springdoc-openapi-starter-webmvc-api/src/test/resources/application-212.yml

+7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@ springdoc:
44
title: Api info title
55
description: Api info description
66
version: Api info version
7+
security:
8+
- basicScheme: [ ]
79
components:
10+
securitySchemes:
11+
basicScheme:
12+
type: http
13+
scheme: bearer
14+
bearerFormat: JWT
815
schemas:
916
PersonDTO:
1017
description: Description for PersonDTO component

Diff for: springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app212-grouped.json

+12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
"description": "Generated server url"
1212
}
1313
],
14+
"security": [
15+
{
16+
"basicScheme": []
17+
}
18+
],
1419
"paths": {
1520
"/persons3": {
1621
"get": {
@@ -110,6 +115,13 @@
110115
},
111116
"description": "Description for PersonDTO component in ApiGroupName"
112117
}
118+
},
119+
"securitySchemes": {
120+
"basicScheme": {
121+
"type": "http",
122+
"scheme": "bearer",
123+
"bearerFormat": "JWT"
124+
}
113125
}
114126
}
115127
}

Diff for: springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app212.json

+12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
"description": "Generated server url"
1212
}
1313
],
14+
"security": [
15+
{
16+
"basicScheme": []
17+
}
18+
],
1419
"paths": {
1520
"/persons3": {
1621
"get": {
@@ -108,6 +113,13 @@
108113
},
109114
"description": "Description for PersonDTO component"
110115
}
116+
},
117+
"securitySchemes": {
118+
"basicScheme": {
119+
"type": "http",
120+
"scheme": "bearer",
121+
"bearerFormat": "JWT"
122+
}
111123
}
112124
}
113125
}

0 commit comments

Comments
 (0)