Spring Boot 2.7.3中Actuator SanitizingFunction Bean在/env端点不生效
Spring Boot 2.7.3 Actuator /env 字段脱敏问题解决
问题背景
使用Spring Boot 2.7.3版本,需屏蔽/actuator/env响应中所有包含uri字符串的字段。按照官方文档指引,通过定义SanitizingFunction类型的Bean实现自定义脱敏逻辑:
import org.springframework.boot.actuate.endpoint.SanitizingFunction; @Component public class ActuatorSanitizer implements SanitizingFunction { // 自定义脱敏逻辑实现 }
调试启动过程时,能看到该Bean已初始化并注入到org.springframework.boot.actuate.endpoint.Sanitizer类的实例中:
public Sanitizer(Iterable<SanitizingFunction> sanitizingFunctions, String... keysToSanitize) { this.sanitizingFunctions = new ArrayList(); List var10001 = this.sanitizingFunctions; sanitizingFunctions.forEach(var10001::add); this.sanitizingFunctions.add(this.getDefaultSanitizingFunction()); this.setKeysToSanitize(keysToSanitize); }
但后续发现Sanitizer构造函数会被调用两次,第二次调用时并未注入自定义的ActuatorSanitizer,导致/actuator/env接口无脱敏效果;而自定义脱敏逻辑在/actuator/configprops请求中正常生效。
原因分析
Spring Boot 2.7.x中,/actuator/env和/actuator/configprops使用的是独立的Sanitizer实例:
ConfigPropsEndpoint会自动加载上下文内所有的SanitizingFunctionBean;EnvironmentEndpoint则是通过EnvironmentEndpointAutoConfiguration单独创建Sanitizer实例,默认不会注入自定义的SanitizingFunction,因此自定义脱敏逻辑仅在configprops端点生效。
解决方案
方案一:自定义EnvironmentEndpoint Bean
手动创建EnvironmentEndpoint Bean,将上下文内的SanitizingFunction集合注入进去,替换默认的端点实例:
import org.springframework.boot.actuate.endpoint.SanitizingFunction; import org.springframework.boot.actuate.env.EnvironmentEndpoint; import org.springframework.boot.actuate.env.EnvironmentEndpointProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ActuatorConfig { @Bean public EnvironmentEndpoint environmentEndpoint(EnvironmentEndpointProperties properties, Iterable<SanitizingFunction> sanitizingFunctions) { EnvironmentEndpoint endpoint = new EnvironmentEndpoint(properties); endpoint.setSanitizingFunctions(sanitizingFunctions); return endpoint; } }
方案二:使用EndpointCustomizer扩展
通过EndpointCustomizer接口修改已有的EnvironmentEndpoint配置,注入自定义脱敏函数:
import org.springframework.boot.actuate.endpoint.SanitizingFunction; import org.springframework.boot.actuate.env.EnvironmentEndpoint; import org.springframework.boot.actuate.endpoint.EndpointCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ActuatorConfig { @Bean public EndpointCustomizer<EnvironmentEndpoint> environmentEndpointCustomizer(Iterable<SanitizingFunction> sanitizingFunctions) { return endpoint -> endpoint.setSanitizingFunctions(sanitizingFunctions); } }
补充:配置式脱敏(仅精确匹配)
如果只需对特定关键字的字段脱敏(精确匹配),可以直接通过配置属性添加,无需自定义Bean:
management.endpoint.env.keys-to-sanitize=uri,db-password,access-token
但该方式仅支持精确匹配字段名,无法实现“包含uri字符串”的模糊匹配需求,这种场景仍需结合自定义SanitizingFunction和上述编程方案。
内容的提问来源于stack exchange,提问作者Ivan Karotki
相关产品推荐
相关产品推荐

