Skip to content

Commit 812ca0b

Browse files
authored
Merge pull request #221 from llin6025/fix-issue-220
Fix issue 220
2 parents 08277d0 + 1017efd commit 812ca0b

File tree

3 files changed

+103
-40
lines changed

3 files changed

+103
-40
lines changed

src/main/java/com/spring4all/swagger/DocketConfiguration.java

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.spring4all.swagger;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
5-
import java.util.Map;
3+
import static com.google.common.collect.Lists.newArrayList;
4+
5+
import java.util.*;
66
import java.util.function.Predicate;
77
import java.util.stream.Collectors;
88

@@ -25,6 +25,7 @@
2525
import springfox.documentation.schema.ScalarType;
2626
import springfox.documentation.service.ApiInfo;
2727
import springfox.documentation.service.Contact;
28+
import springfox.documentation.service.ParameterType;
2829
import springfox.documentation.service.RequestParameter;
2930
import springfox.documentation.spi.DocumentationType;
3031
import springfox.documentation.spring.web.plugins.Docket;
@@ -45,6 +46,9 @@ public class DocketConfiguration implements BeanFactoryAware {
4546
@Autowired
4647
private SwaggerProperties swaggerProperties;
4748

49+
@Autowired
50+
private SwaggerAuthorizationConfiguration authConfiguration;
51+
4852
private static final String BEAN_NAME = "spring-boot-starter-swagger-";
4953

5054
@Override
@@ -70,7 +74,11 @@ public void createSpringFoxRestApi() {
7074

7175
Docket docket4Group = (Docket)beanFactory.getBean(beanName);
7276
ApiInfo apiInfo = apiInfo(swaggerProperties);
73-
docket4Group.host(swaggerProperties.getHost()).apiInfo(apiInfo).select()
77+
docket4Group.host(swaggerProperties.getHost()).apiInfo(apiInfo)
78+
.globalRequestParameters(
79+
assemblyRequestParameters(swaggerProperties.getGlobalOperationParameters(), new ArrayList<>()))
80+
.securityContexts(Collections.singletonList(authConfiguration.securityContext()))
81+
.securitySchemes(authConfiguration.getSecuritySchemes()).select()
7482
.apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
7583
.paths(paths(swaggerProperties.getBasePath(), swaggerProperties.getExcludePath())).build();
7684
return;
@@ -124,7 +132,11 @@ public void createSpringFoxRestApi() {
124132
beanRegistry.registerBeanDefinition(beanName, beanDefinition4Group);
125133

126134
Docket docket4Group = (Docket)beanFactory.getBean(beanName);
127-
docket4Group.groupName(groupName).host(docketInfo.getBasePackage()).apiInfo(apiInfo).select()
135+
docket4Group.groupName(groupName).host(docketInfo.getBasePackage()).apiInfo(apiInfo)
136+
.globalRequestParameters(assemblyRequestParameters(swaggerProperties.getGlobalOperationParameters(),
137+
docketInfo.getGlobalOperationParameters()))
138+
.securityContexts(Collections.singletonList(authConfiguration.securityContext()))
139+
.securitySchemes(authConfiguration.getSecuritySchemes()).select()
128140
.apis(RequestHandlerSelectors.basePackage(docketInfo.getBasePackage()))
129141
.paths(paths(docketInfo.getBasePath(), docketInfo.getExcludePath())).build();
130142
}
@@ -133,19 +145,53 @@ public void createSpringFoxRestApi() {
133145
/**
134146
* 全局请求参数
135147
*
136-
* @param swaggerProperties
148+
* @param properties
137149
* {@link SwaggerProperties}
138150
* @return RequestParameter {@link RequestParameter}
139151
*/
140-
private List<RequestParameter> globalRequestParameters(SwaggerProperties swaggerProperties) {
141-
return swaggerProperties.getGlobalOperationParameters().stream()
152+
private List<RequestParameter> getRequestParameters(List<SwaggerProperties.GlobalOperationParameter> properties) {
153+
return properties.stream()
142154
.map(param -> new RequestParameterBuilder().name(param.getName()).description(param.getDescription())
143-
.in(param.getParameterType()).required(param.getRequired())
144-
.query(q -> q.defaultValue(param.getModelRef()))
145-
.query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))).build())
155+
.in(ParameterType.from(param.getParameterType())).required(param.getRequired())
156+
.query(q -> q.defaultValue(param.getType()))
157+
.query(q -> q.model(m -> m.scalarModel(!ScalarType.from(param.getType(), param.getFormat()).isPresent()
158+
? ScalarType.STRING : ScalarType.from(param.getType(), param.getFormat()).get())))
159+
.build())
146160
.collect(Collectors.toList());
147161
}
148162

163+
/**
164+
* 局部参数按照name覆盖局部参数
165+
*
166+
* @param globalRequestParameters 全局配置
167+
* @param groupRequestParameters Group 的配置
168+
* @return 汇总配置
169+
*/
170+
private List<RequestParameter> assemblyRequestParameters(
171+
List<SwaggerProperties.GlobalOperationParameter> globalRequestParameters,
172+
List<SwaggerProperties.GlobalOperationParameter> groupRequestParameters) {
173+
174+
if (Objects.isNull(groupRequestParameters) || groupRequestParameters.isEmpty()) {
175+
return getRequestParameters(globalRequestParameters);
176+
}
177+
178+
Set<String> paramNames = groupRequestParameters.stream()
179+
.map(SwaggerProperties.GlobalOperationParameter::getName).collect(Collectors.toSet());
180+
181+
List<SwaggerProperties.GlobalOperationParameter> requestParameters = newArrayList();
182+
183+
if (Objects.nonNull(globalRequestParameters)) {
184+
for (SwaggerProperties.GlobalOperationParameter parameter : globalRequestParameters) {
185+
if (!paramNames.contains(parameter.getName())) {
186+
requestParameters.add(parameter);
187+
}
188+
}
189+
}
190+
191+
requestParameters.addAll(groupRequestParameters);
192+
return getRequestParameters(requestParameters);
193+
}
194+
149195
/**
150196
* API接口路径选择
151197
*
Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package com.spring4all.swagger;
22

3+
import java.util.Collections;
4+
import java.util.List;
5+
36
import org.springframework.boot.context.properties.EnableConfigurationProperties;
47
import org.springframework.context.annotation.Configuration;
8+
59
import springfox.documentation.builders.PathSelectors;
6-
import springfox.documentation.service.ApiKey;
7-
import springfox.documentation.service.AuthorizationScope;
8-
import springfox.documentation.service.BasicAuth;
9-
import springfox.documentation.service.SecurityReference;
10+
import springfox.documentation.service.*;
1011
import springfox.documentation.spi.service.contexts.SecurityContext;
1112
import springfox.documentation.swagger.web.ApiKeyVehicle;
1213

13-
import java.util.Collections;
14-
import java.util.List;
15-
1614
/**
1715
* securitySchemes 支持方式之一 ApiKey
1816
*
@@ -24,43 +22,55 @@
2422
@EnableConfigurationProperties(SwaggerAuthorizationProperties.class)
2523
public class SwaggerAuthorizationConfiguration {
2624

27-
public SwaggerAuthorizationProperties swaggerAuthorizationProperties;
25+
public SwaggerAuthorizationProperties properties;
2826

29-
public SwaggerAuthorizationConfiguration(SwaggerAuthorizationProperties swaggerAuthorizationProperties) {
30-
this.swaggerAuthorizationProperties = swaggerAuthorizationProperties;
27+
public SwaggerAuthorizationConfiguration(SwaggerAuthorizationProperties properties) {
28+
this.properties = properties;
3129
}
3230

31+
/**
32+
* 配置默认的全局鉴权策略的开关,以及通过正则表达式进行匹配
33+
*
34+
* @return SecurityContext
35+
*/
3336
public SecurityContext securityContext() {
3437
// 配置默认的全局鉴权策略的开关,以及通过正则表达式进行匹配;默认 ^.*$ 匹配所有URL
3538
// 其中 securityReferences 为配置启用的鉴权策略
3639
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
3740
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
3841
authorizationScopes[0] = authorizationScope;
39-
List<SecurityReference> defaultAuth = Collections.singletonList(SecurityReference.builder()
40-
.reference(swaggerAuthorizationProperties.getName())
41-
.scopes(authorizationScopes).build());
42+
List<SecurityReference> defaultAuth = Collections.singletonList(
43+
SecurityReference.builder().reference(properties.getName()).scopes(authorizationScopes).build());
44+
45+
return SecurityContext.builder().securityReferences(defaultAuth)
46+
.forPaths(PathSelectors.regex(properties.getAuthRegex())).build();
47+
}
4248

43-
return SecurityContext.builder()
44-
.securityReferences(defaultAuth)
45-
.forPaths(PathSelectors.regex(swaggerAuthorizationProperties.getAuthRegex()))
46-
.build();
49+
/**
50+
* Authorization 配置项
51+
*
52+
* @return List<SecurityScheme>
53+
*/
54+
public List<SecurityScheme> getSecuritySchemes() {
55+
if ("BasicAuth".equalsIgnoreCase(getType())) {
56+
return Collections.singletonList(basicAuth());
57+
} else if (!"None".equalsIgnoreCase(getType())) {
58+
return Collections.singletonList(apiKey());
59+
}
60+
return null;
4761
}
4862

49-
public ApiKey apiKey() {
63+
private ApiKey apiKey() {
5064
// 配置基于 ApiKey 的鉴权对象
51-
return new ApiKey(swaggerAuthorizationProperties.getName(),
52-
swaggerAuthorizationProperties.getKeyName(),
53-
ApiKeyVehicle.HEADER.getValue());
65+
return new ApiKey(properties.getName(), properties.getKeyName(), ApiKeyVehicle.HEADER.getValue());
5466
}
5567

56-
public BasicAuth basicAuth() {
68+
private BasicAuth basicAuth() {
5769
// 配置基于 BasicAuth 的鉴权对象
58-
return new BasicAuth(swaggerAuthorizationProperties.getName());
70+
return new BasicAuth(properties.getName());
5971
}
6072

61-
public String getType() {
62-
return swaggerAuthorizationProperties.getType();
73+
private String getType() {
74+
return properties.getType();
6375
}
64-
65-
6676
}

src/main/java/com/spring4all/swagger/SwaggerProperties.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.List;
66
import java.util.Map;
77

8+
import org.springframework.beans.factory.annotation.Value;
89
import org.springframework.boot.context.properties.ConfigurationProperties;
910

1011
import lombok.Data;
@@ -106,7 +107,13 @@ public static class GlobalOperationParameter {
106107
/**
107108
* 指定参数类型
108109
**/
109-
private String modelRef;
110+
@Value("modelRef")
111+
private String type;
112+
113+
/**
114+
* 指定参数类型
115+
**/
116+
private String format = "";
110117

111118
/**
112119
* 参数放在哪个地方:header,query,path,formData,cookie,form
@@ -116,7 +123,7 @@ public static class GlobalOperationParameter {
116123
/**
117124
* 参数是否必须传
118125
**/
119-
private Boolean required;
126+
private Boolean required = false;
120127

121128
}
122129

0 commit comments

Comments
 (0)