mirror of
https://gitee.com/log4j/pig.git
synced 2025-01-03 23:42:22 +08:00
!230 根据配置文件是否开启 swagger 认证模式
Merge pull request !230 from edgarlizhiyu/master
This commit is contained in:
commit
f98b5ae8a6
@ -3,9 +3,11 @@ package com.pig4cloud.pig.gateway.config;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.pig4cloud.pig.gateway.filter.PasswordDecoderFilter;
|
import com.pig4cloud.pig.gateway.filter.PasswordDecoderFilter;
|
||||||
import com.pig4cloud.pig.gateway.filter.PigRequestGlobalFilter;
|
import com.pig4cloud.pig.gateway.filter.PigRequestGlobalFilter;
|
||||||
|
import com.pig4cloud.pig.gateway.filter.SwaggerBasicGatewayFilter;
|
||||||
import com.pig4cloud.pig.gateway.filter.ValidateCodeGatewayFilter;
|
import com.pig4cloud.pig.gateway.filter.ValidateCodeGatewayFilter;
|
||||||
import com.pig4cloud.pig.gateway.handler.GlobalExceptionHandler;
|
import com.pig4cloud.pig.gateway.handler.GlobalExceptionHandler;
|
||||||
import com.pig4cloud.pig.gateway.handler.ImageCodeHandler;
|
import com.pig4cloud.pig.gateway.handler.ImageCodeHandler;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
@ -30,6 +32,12 @@ public class GatewayConfiguration {
|
|||||||
return new PigRequestGlobalFilter();
|
return new PigRequestGlobalFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnProperty(name = "swagger.basic.enable")
|
||||||
|
public SwaggerBasicGatewayFilter swaggerBasicGatewayFilter(SwaggerProperties swaggerProperties){
|
||||||
|
return new SwaggerBasicGatewayFilter(swaggerProperties);
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties,
|
public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties,
|
||||||
ObjectMapper objectMapper, RedisTemplate redisTemplate) {
|
ObjectMapper objectMapper, RedisTemplate redisTemplate) {
|
||||||
|
@ -1,18 +1,14 @@
|
|||||||
package com.pig4cloud.pig.gateway.config;
|
package com.pig4cloud.pig.gateway.config;
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import org.springdoc.core.GroupedOpenApi;
|
import org.springdoc.core.GroupedOpenApi;
|
||||||
import org.springdoc.core.SwaggerUiConfigParameters;
|
import org.springdoc.core.SwaggerUiConfigParameters;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author lengleng
|
* @author lengleng
|
||||||
@ -27,21 +23,13 @@ public class SpringDocConfiguration {
|
|||||||
@Lazy(false)
|
@Lazy(false)
|
||||||
@ConditionalOnProperty(name = "springdoc.api-docs.enabled", matchIfMissing = true)
|
@ConditionalOnProperty(name = "springdoc.api-docs.enabled", matchIfMissing = true)
|
||||||
public List<GroupedOpenApi> apis(SwaggerUiConfigParameters swaggerUiConfigParameters,
|
public List<GroupedOpenApi> apis(SwaggerUiConfigParameters swaggerUiConfigParameters,
|
||||||
SwaggerProperties properties) {
|
SwaggerProperties swaggerProperties) {
|
||||||
List<GroupedOpenApi> groups = new ArrayList<>();
|
List<GroupedOpenApi> groups = new ArrayList<>();
|
||||||
for (String value : properties.services.values()) {
|
for (String value : swaggerProperties.getServices().values()) {
|
||||||
swaggerUiConfigParameters.addGroup(value);
|
swaggerUiConfigParameters.addGroup(value);
|
||||||
}
|
}
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Data
|
|
||||||
@Component
|
|
||||||
@ConfigurationProperties("swagger")
|
|
||||||
class SwaggerProperties {
|
|
||||||
|
|
||||||
private Map<String, String> services;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2025, lengleng All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the pig4cloud.com developer nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
* Author: lengleng (wangiegie@gmail.com)
|
||||||
|
*/
|
||||||
|
package com.pig4cloud.pig.gateway.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SwaggerProperties
|
||||||
|
*
|
||||||
|
* swagger:
|
||||||
|
* basic:
|
||||||
|
* enable: true
|
||||||
|
* username: admin
|
||||||
|
* password: admin
|
||||||
|
*
|
||||||
|
* @author edgar
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties("swagger")
|
||||||
|
public class SwaggerProperties {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否开启swagger
|
||||||
|
*/
|
||||||
|
private Boolean enabled = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* swagger会解析的包路径
|
||||||
|
**/
|
||||||
|
private String basePackage = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* swagger会解析的url规则
|
||||||
|
**/
|
||||||
|
private List<String> basePath = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在basePath基础上需要排除的url规则
|
||||||
|
**/
|
||||||
|
private List<String> excludePath = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要排除的服务
|
||||||
|
*/
|
||||||
|
private List<String> ignoreProviders = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标题
|
||||||
|
**/
|
||||||
|
private String title = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网关
|
||||||
|
*/
|
||||||
|
private String gateway;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取token
|
||||||
|
*/
|
||||||
|
private String tokenUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 作用域
|
||||||
|
*/
|
||||||
|
private String scope;
|
||||||
|
|
||||||
|
private Map<String, String> services;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证参数
|
||||||
|
*/
|
||||||
|
private SwaggerBasic basic = new SwaggerBasic();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class SwaggerBasic {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否开启 basic 认证
|
||||||
|
*/
|
||||||
|
private Boolean enabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 密码
|
||||||
|
*/
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package com.pig4cloud.pig.gateway.filter;
|
||||||
|
|
||||||
|
import com.pig4cloud.pig.gateway.config.SwaggerProperties;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||||
|
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||||
|
import org.springframework.util.Base64Utils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* swagger 开启basic 认证
|
||||||
|
*
|
||||||
|
* @author edgar
|
||||||
|
* @date 2022/5/8
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class SwaggerBasicGatewayFilter implements GlobalFilter {
|
||||||
|
|
||||||
|
private static final String API_URI = "/v3/api-docs";
|
||||||
|
|
||||||
|
private static final String BASIC_PREFIX = "Basic ";
|
||||||
|
|
||||||
|
private final SwaggerProperties swaggerProperties;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||||
|
ServerHttpRequest request = exchange.getRequest();
|
||||||
|
|
||||||
|
if (!request.getURI().getPath().contains(API_URI)) {
|
||||||
|
return chain.filter(exchange);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasAuth(exchange)) {
|
||||||
|
return chain.filter(exchange);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ServerHttpResponse response = exchange.getResponse();
|
||||||
|
response.setStatusCode(HttpStatus.UNAUTHORIZED);
|
||||||
|
response.getHeaders().add(HttpHeaders.WWW_AUTHENTICATE, "Basic Realm=\"pig\"");
|
||||||
|
return response.setComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简单的basic认证
|
||||||
|
* @param exchange 上下文
|
||||||
|
* @return 是否有权限
|
||||||
|
*/
|
||||||
|
private boolean hasAuth(ServerWebExchange exchange) {
|
||||||
|
ServerHttpRequest request = exchange.getRequest();
|
||||||
|
String auth = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
|
||||||
|
log.info("Basic认证信息为:{}", auth);
|
||||||
|
if (!StringUtils.hasText(auth) || !auth.startsWith(BASIC_PREFIX)) {
|
||||||
|
return Boolean.FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
String username = swaggerProperties.getBasic().getUsername();
|
||||||
|
String password = swaggerProperties.getBasic().getPassword();
|
||||||
|
|
||||||
|
String encodeToString = Base64Utils
|
||||||
|
.encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
return auth.equals(BASIC_PREFIX + encodeToString);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user