在 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;
}
}
我正在尝试使用 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;
}
}