You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会自动加载上下文内所有的SanitizingFunction Bean;
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:26:09