集成统一签名验证的配置方法
在Spring Cloud Gateway中实现接口统一签名验证,可以通过自定义过滤器和配置管理来实现路径拦截与排除。以下是一个典型的实现方案:
配置拦截路径与排除路径
在application.yml
中配置需要拦截和排除的路径:
security:
signature:
#是否开启验签
enable: true
#是否开启日志显示
logEnable: false
#过期时间
expireTime: 60
#签名算法模型
algorithm: "SHA256withRSA"
#验签公钥
public-key: ""
#需要验签的路劲
include-paths:
- "/superior/**"
- "/new_applet/**"
#需要排除的路径
exclude-paths:
- "/actuator/**"
自定义签名验证过滤器
创建SignatureValidationFilter
实现GlobalFilter
接口:
/**
* @author xiongbing
* @date 2025/8/15 13:40
* @description
*/
@Slf4j
@Component
@AllArgsConstructor
public class SignatureValidationFilter extends CommonFilter implements GlobalFilter, Ordered {
private final SignatureProperties signatureProperties;
private static final String TIMESTAMP_HEADER = "X-Timestamp";
private static final String SIGNATURE_HEADER = "X-Sign";
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 检查是否启用签名验证
if (!signatureProperties.isEnable()) {
return chain.filter(exchange);
}
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().value();
// 检查路径是否需要验证签名
.....
.....
//防重放攻击
.....
.....
//验签
.....
.....
return 验签结果;
}
@Override
public int getOrder() {
// 设置在缓存过滤器之后执行
return Ordered.HIGHEST_PRECEDENCE + 1;
}
}
动态配置管理
对于需要动态更新的配置,可以结合配置中心实现:
@RefreshScope
@Configuration
public class SignatureProperties {
@Value("${security.signature.includePaths}")
private List<String> includePaths;
@Value("${security.signature.excludePaths}")
private List<String> excludePaths;
// Getter方法
}
这种实现方式既支持静态配置也支持动态更新,能够灵活处理各种路径匹配需求,同时保持较高的性能表现。
具体请参考源码:https://github.com/xiaobinger/GatewayApiSignature