-
Notifications
You must be signed in to change notification settings - Fork 629
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'origin/dev' into dev
- Loading branch information
Showing
3 changed files
with
135 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,6 +23,7 @@ | |
|
||
import java.util.Enumeration; | ||
import java.util.List; | ||
import java.util.Objects; | ||
|
||
/** | ||
* @author <a href="[email protected]">[email protected]</a> | ||
|
@@ -74,21 +75,23 @@ protected boolean tryCommonBasic(String url, Object sessionAuth, String auth) { | |
if (sessionAuth == null) { | ||
// 获取请求头Authorization | ||
if (StrUtil.isBlank(auth)) { | ||
return Boolean.FALSE; | ||
return false; | ||
} | ||
if (auth.length() < 6) { | ||
return false; | ||
} | ||
String userAndPass = decodeBase64(auth.substring(6)); | ||
if (userAndPass == null) { | ||
return false; | ||
} | ||
String[] upArr = userAndPass.split(":"); | ||
if (upArr.length != 2) { | ||
return false; | ||
} else { | ||
String iptUser = upArr[0]; | ||
String iptPass = upArr[1]; | ||
// 匹配服务端用户名及密码 | ||
if (iptUser.equals(getUserName()) && iptPass.equals(getPassword())) { | ||
return true; | ||
} else { | ||
return false; | ||
} | ||
return Objects.equals(iptUser, getUserName()) && Objects.equals(iptPass, getPassword()); | ||
} | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,44 +14,143 @@ | |
* limitations under the License. | ||
*/ | ||
|
||
|
||
package com.github.xiaoymin.knife4j.spring.extension; | ||
|
||
import com.github.xiaoymin.knife4j.annotations.ApiSupport; | ||
import com.github.xiaoymin.knife4j.core.conf.ExtensionsConstants; | ||
import com.github.xiaoymin.knife4j.core.conf.GlobalConstants; | ||
import com.github.xiaoymin.knife4j.spring.configuration.Knife4jProperties; | ||
import com.github.xiaoymin.knife4j.spring.configuration.Knife4jSetting; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import io.swagger.v3.oas.models.OpenAPI; | ||
import java.lang.annotation.Annotation; | ||
import java.util.*; | ||
import java.util.stream.Collectors; | ||
import lombok.AllArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.apache.commons.lang3.*; | ||
import org.springdoc.core.SpringDocConfigProperties; | ||
import org.springdoc.core.customizers.GlobalOpenApiCustomizer; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
import org.springframework.beans.factory.config.BeanDefinition; | ||
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; | ||
import org.springframework.core.type.filter.AnnotationTypeFilter; | ||
import org.springframework.util.CollectionUtils; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
/** | ||
* 增强扩展属性支持 | ||
* @since | ||
* @author <a href="[email protected]">[email protected]</a> | ||
* 2022/12/11 22:40 | ||
* | ||
* @since | ||
* @author <a href="[email protected]">[email protected]</a> 2022/12/11 22:40 | ||
*/ | ||
@Slf4j | ||
@AllArgsConstructor | ||
public class Knife4jOpenApiCustomizer implements GlobalOpenApiCustomizer { | ||
|
||
final Knife4jProperties knife4jProperties; | ||
|
||
@Override | ||
public void customise(OpenAPI openApi) { | ||
log.debug("Knife4j OpenApiCustomizer"); | ||
if (knife4jProperties.isEnable()) { | ||
Knife4jSetting setting = knife4jProperties.getSetting(); | ||
OpenApiExtensionResolver openApiExtensionResolver = new OpenApiExtensionResolver(setting, knife4jProperties.getDocuments()); | ||
// 解析初始化 | ||
openApiExtensionResolver.start(); | ||
Map<String, Object> objectMap = new HashMap<>(); | ||
objectMap.put(GlobalConstants.EXTENSION_OPEN_SETTING_NAME, setting); | ||
objectMap.put(GlobalConstants.EXTENSION_OPEN_MARKDOWN_NAME, openApiExtensionResolver.getMarkdownFiles()); | ||
openApi.addExtension(GlobalConstants.EXTENSION_OPEN_API_NAME, objectMap); | ||
|
||
final Knife4jProperties knife4jProperties; | ||
final SpringDocConfigProperties properties; | ||
|
||
@Override | ||
public void customise(OpenAPI openApi) { | ||
log.debug("Knife4j OpenApiCustomizer"); | ||
if (knife4jProperties.isEnable()) { | ||
Knife4jSetting setting = knife4jProperties.getSetting(); | ||
OpenApiExtensionResolver openApiExtensionResolver = | ||
new OpenApiExtensionResolver(setting, knife4jProperties.getDocuments()); | ||
// 解析初始化 | ||
openApiExtensionResolver.start(); | ||
Map<String, Object> objectMap = new HashMap<>(); | ||
objectMap.put(GlobalConstants.EXTENSION_OPEN_SETTING_NAME, setting); | ||
objectMap.put( | ||
GlobalConstants.EXTENSION_OPEN_MARKDOWN_NAME, | ||
openApiExtensionResolver.getMarkdownFiles()); | ||
openApi.addExtension(GlobalConstants.EXTENSION_OPEN_API_NAME, objectMap); | ||
addOrderExtension(openApi); | ||
} | ||
} | ||
|
||
/** | ||
* 往OpenAPI内tags字段添加x-order属性 | ||
* | ||
* @param openApi openApi | ||
*/ | ||
private void addOrderExtension(OpenAPI openApi) { | ||
if (CollectionUtils.isEmpty(properties.getGroupConfigs())) { | ||
return; | ||
} | ||
// 获取包扫描路径 | ||
Set<String> packagesToScan = | ||
properties.getGroupConfigs().stream() | ||
.map(SpringDocConfigProperties.GroupConfig::getPackagesToScan) | ||
.flatMap(List::stream) | ||
.collect(Collectors.toSet()); | ||
if (CollectionUtils.isEmpty(packagesToScan)) { | ||
return; | ||
} | ||
// 扫描包下被ApiSupport注解的RestController Class | ||
Set<Class<?>> classes = | ||
packagesToScan.stream() | ||
.map(packageToScan -> scanPackageByAnnotation(packageToScan, RestController.class)) | ||
.flatMap(Set::stream) | ||
.filter(clazz -> clazz.isAnnotationPresent(ApiSupport.class)) | ||
.collect(Collectors.toSet()); | ||
if (!CollectionUtils.isEmpty(classes)) { | ||
// ApiSupport oder值存入tagSortMap<Tag.name,ApiSupport.order> | ||
Map<String, Integer> tagOrderMap = new HashMap<>(); | ||
classes.forEach( | ||
clazz -> { | ||
Tag tag = getTag(clazz); | ||
if (Objects.nonNull(tag)) { | ||
ApiSupport apiSupport = clazz.getAnnotation(ApiSupport.class); | ||
tagOrderMap.putIfAbsent(tag.name(), apiSupport.order()); | ||
} | ||
}); | ||
// 往openApi tags字段添加x-order增强属性 | ||
openApi | ||
.getTags() | ||
.forEach( | ||
tag -> { | ||
if (tagOrderMap.containsKey(tag.getName())) { | ||
tag.addExtension( | ||
ExtensionsConstants.EXTENSION_ORDER, tagOrderMap.get(tag.getName())); | ||
} | ||
}); | ||
} | ||
} | ||
|
||
private Tag getTag(Class<?> clazz) { | ||
// 从类上获取 | ||
Tag tag = clazz.getAnnotation(Tag.class); | ||
if (Objects.isNull(tag)) { | ||
// 从接口上获取 | ||
Class<?>[] interfaces = clazz.getInterfaces(); | ||
if (ArrayUtils.isNotEmpty(interfaces)) { | ||
for (Class<?> interfaceClazz : interfaces) { | ||
Tag anno = interfaceClazz.getAnnotation(Tag.class); | ||
if (Objects.nonNull(anno)) { | ||
tag = anno; | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
return tag; | ||
} | ||
|
||
private Set<Class<?>> scanPackageByAnnotation( | ||
String packageName, final Class<? extends Annotation> annotationClass) { | ||
ClassPathScanningCandidateComponentProvider scanner = | ||
new ClassPathScanningCandidateComponentProvider(false); | ||
scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass)); | ||
Set<Class<?>> classes = new HashSet<>(); | ||
for (BeanDefinition beanDefinition : scanner.findCandidateComponents(packageName)) { | ||
try { | ||
Class<?> clazz = Class.forName(beanDefinition.getBeanClassName()); | ||
classes.add(clazz); | ||
} catch (ClassNotFoundException ignore) { | ||
|
||
} | ||
} | ||
return classes; | ||
} | ||
} |