在 Spring 引导中使用 Jasypt 加载解密的密码

Loading decrypted Password with Jasypt in Spring Boot

我正在尝试使用 Spring Boot 设置 Jasypt 工作流程。如this Tutorial中所述,我添加了所需的依赖项:

<dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.4</version>
</dependency>

使用以下方法加密密码:

mvn jasypt:encrypt-value -Djasypt.encryptor.password=javatechie -Djasypt.plugin.value=Password

创建了一个encrypted.properties并将加密后的密码放入其中:

secret.property=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCAaskygdq8PHapYFnlX6WsTwZZOxWInq+i)

注释了我的 Main Class:

@SpringBootApplication
@EnableEncryptableProperties
@PropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

在另一个class中我尝试加载解密值:

@Component
public class MyOtherClass {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyOtherClass.class);

    @Value("${secret.property}")
    String secret;

    public MyOtherClass() {
        LOGGER.info("PW: " + secret);
    }
}

但我刚得到:

PW: null

当我将值更改为不存在的值时:

@Value("${abc.def}")
String secret;

我得到了预期的错误:

java.lang.IllegalArgumentException: Could not resolve placeholder 'abc.def' in value "${abc.def}"

所以好像找到了我的实际值secret.property,但为什么是null

您正在访问构造函数中注入的 属性。这不起作用,因为这里 Spring 将实例化 bean,然后注入 属性。因此,如果您在构造函数中访问 属性,您将获得注入前的默认值,即 null。如果你想在构造函数中访问 属性,那么你可以像这样使用构造函数注入:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyOtherClass {
    private static final Logger LOGGER = 
                      LoggerFactory.getLogger(MyOtherClass.class);

    String secret;

    @Autowired
    public MyOtherClass(@Value("${secret.property}") String secret) {
        LOGGER.info("PW: " + secret);
        this.secret = secret;
    }
}