0

我使用的 spring boot 版本是 2.1.5.RELEASE。我的项目使用redis。为了安全,我加密了我的redis密码。我在我的application.properties中设置了如下值:</p>

spring.redis.password=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

我想在spring bean的init之前解密,所以我想改变RedisProperties的passowrd属性的值。所以我自定义一个BeanPostProcesser是这样的:

@Component
public class PasswordBeanPostProcessor implements BeanPostProcessor {

    @Autowired
    private Cryptor cryptor;

    @Value("${spring.redis.password}")
    private String password;

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("beanName = {}",beanName);
        if (bean instanceof RedisProperties) {
            RedisProperties redisPropertiesBean = (RedisProperties) bean;
            try {
                redisPropertiesBean.setPassword(cryptor.decrypt(password));
                log.debug(redisPropertiesBean.getPassword());
                return redisPropertiesBean;
            } catch (Exception ex) {
                log.error("redis password decrypt error", ex);
                throw new RuntimeException(ex);
            }
        }
        return bean;
    }
}

但这不起作用,当我运行我的应用程序时,没有像这样打印的日志:

beanName = redisProperties

为了确保我的 bean 中有一个命名的 bean redisPropertiesapplicationContext我将 bean 注入RedisProperties另一个 Bean。它运行良好,我可以在RedisProperties.

为了使我的应用程序使用加密密码成功运行,我用另一个方法解密了redis的密码。@PostConstruct但我认为这种方式并不优雅,正确的方法是什么?

谁能帮帮我,拜托

4

1 回答 1

0

好的,我知道不能使用 jasypt。然而,看看它的源代码,它相当简单,因为你已经使用了 Bean Post Processors,这是 spring / spring boot 中相当先进的东西

它的启动器(自动配置模块)在这里可用

所以你会看到它spring.factories启用了一些引导和自动配置。

最终你会看到实际处理加密的代码

它使用 bean 工厂后处理器——当 bean 定义准备好但实际 bean 尚未创建时启动。这是一个与您相关的钩子。当然实现会有所不同,但“编排”是相同的......

于 2020-06-16T13:50:01.690 回答