Spring 4/Boot中加密属性的完全集成

Spring 4/Boot中加密属性的完全集成,spring,spring-boot,jasypt,Spring,Spring Boot,Jasypt,我们使用Jasypt对一些配置属性(数据库密码)进行加密,但由于解密密钥存储在每个环境的文件系统中,因此我们必须进行一些手动@Bean配置,从文件加载密码,然后用EncryptablePropertiesPropertySource覆盖加载属性 因为它是如此的手动,我们不得不在WebApplicationConfig类的@PostConstruct中运行这段代码,并且(尽管这还没有发生)在数据源bean配置了对环境的调用后,它会有加载这些代码的风险,这会导致空指针异常@Lazy加载将是一个选项,

我们使用Jasypt对一些配置属性(数据库密码)进行加密,但由于解密密钥存储在每个环境的文件系统中,因此我们必须进行一些手动
@Bean
配置,从文件加载密码,然后用
EncryptablePropertiesPropertySource
覆盖加载属性

因为它是如此的手动,我们不得不在
WebApplicationConfig
类的
@PostConstruct
中运行这段代码,并且(尽管这还没有发生)在数据源bean配置了对
环境的调用后,它会有加载这些代码的风险,这会导致空指针异常<代码>@Lazy
加载将是一个选项,但显然这意味着我们将使用我们希望避免的脆弱配置


最终,我们希望能够使用默认的
类路径:application.properties
,因此不希望影响现有(默认)设置,但我们确实希望能够使用可加密的属性源作为Spring源的完全替代,并在发生任何其他事情之前让Spring从文件加载解密代码。有没有办法在应用程序启动和配置之前更紧密地集成加载可加密属性

不幸的是,Dave在评论部分提供的链接现在没有指向任何内容,但从其根目录导航到以下示例项目: (当然,大部分也是由戴夫写的)

我认为这是迄今为止评论中讨论的一个很好的例子

另外,为了将来的参考(可能会在某个时候完成),有一个Spring Framework Jira票据,用于使用加密属性的功能:

我正在“裁剪”我以前的答案,因为它被删除了,因为它是从另一个问题复制的:

这个库正是您所需要的,它基本上允许您使用@PropertySource注释以与您使用相同的方式定义属性。您只需向配置文件中添加额外的注释(@EnableEncryptableProperties)。
不仅限于此,环境中存在的每个PropertySource都将转换为EncryptablePropertySourceWrapper,这是一个自定义包装,用于检查属性何时加密并在访问时解密。

这不仅仅是引导问题,而是一般的Spring问题(Spring框架JIRA中有几个与此相关的问题)。我们所做的是很早就自己使用
ApplicationContextInitializer
加载属性文件,然后使用另一个
ApplicationContextInitializer
将它们包装在
EncryptablePropertiesPropertySource
中,这样加载开始后所有属性都可用。Spring Boot使用
ApplicationListener
并对事件作出反应,您可能可以利用它。这也是我们在Spring Cloud中采用的方法,因此您可以从那里复制代码,或者在发布后按原样使用库(但我们不使用Jasypt).Link:@DaveSyer是否有可能将此功能回滚到Spring Boot中?如果有人要求,可能会这样做。不过Spring cloud配置客户端非常轻量级(仅取决于Spring),因此请同时尝试一下。