当前位置:   article > 正文

如何在Spring Cloud中实现Nacos客户端登录密码加密_spring.cloud.nacos.password 加密

spring.cloud.nacos.password 加密

背景

公司规范要求配置文件里不能出现明文的密码。最近项目引入了Nacos作为服务的配置中心,使用的是spring-cloud-starter-alibaba-nacos-config这个包。
基本的bootstrap.yaml配置如下:

  1. spring:
  2. cloud:
  3. nacos:
  4. config:
  5. server-addr: <host>:<port>
  6. prefix: application
  7. group: shared
  8. namespace: xxx
  9. file-extension: yaml
  10. username: user
  11. password: plain_text_password
  12. ......

那么如何将spring.cloud.nacos.config.password换为公司内部加密算法加密后的密码呢?

研究

打开spring-cloud-starter-alibaba-nacos-config的jar包,我们可以在META-INF/spring.factories这个文件中看到以下内容:

  1. org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  2. com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration
  3. ......

Nacos在Spring Cloud的bootstrap阶段可以进行自动配置就是在这里指定的。接下来找到NacosConfigBootstrapConfiguration这个类,发现它获取配置的地方如下:

  1. @Configuration(proxyBeanMethods = false)
  2. @ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
  3. public class NacosConfigBootstrapConfiguration {
  4. @Bean
  5. @ConditionalOnMissingBean
  6. public NacosConfigProperties nacosConfigProperties() {
  7. return new NacosConfigProperties();
  8. }
  9. ......
  10. }

我们可以注意到,它的配置读取靠的是NacosConfigProperties这个类,而且在注入的方法上还添加了@ConditionalOnMissingBean,这就给我们自定义配置读取提供了可能。
按图索骥,我们观察NacosConfigProperties的实现:

  1. @ConfigurationProperties(NacosConfigProperties.PREFIX)
  2. public class NacosConfigProperties {
  3. public static final String PREFIX = "spring.cloud.nacos.config";
  4. ......
  5. @Autowired
  6. @JsonIgnore
  7. private Environment environment;
  8. @PostConstruct
  9. public void init() {
  10. this.overrideFromEnv();
  11. }
  12. private void overrideFromEnv() {
  13. if (StringUtils.isEmpty(this.getServerAddr())) {
  14. String serverAddr = environment
  15. .resolvePlaceholders("${spring.cloud.nacos.config.server-addr:}");
  16. if (StringUtils.isEmpty(serverAddr)) {
  17. serverAddr = environment.resolvePlaceholders(
  18. "${spring.cloud.nacos.server-addr:localhost:8848}");
  19. }
  20. this.setServerAddr(serverAddr);
  21. }
  22. if (StringUtils.isEmpty(this.getUsername())) {
  23. this.setUsername(
  24. environment.resolvePlaceholders("${spring.cloud.nacos.username:}"));
  25. }
  26. if (StringUtils.isEmpty(this.getPassword())) {
  27. this.setPassword(
  28. environment.resolvePlaceholders("${spring.cloud.nacos.password:}"));
  29. }
  30. }
  31. ......
  32. }

这里的后处理方法init调用了一个从Spring Environment中读取配置的overrideFromEnv。我的想法简单粗暴,即继承这个NacosConfigProperties,重写init,在调用完父类方法之后执行公司的密码解密逻辑。因为这已经是在bean的后处理方法中添加的逻辑了,可以说是最后一道配置处理。

实现

话不多说,实现自己的配置类CustomNacosConfigProperties

  1. @ConfigurationProperties(NacosConfigProperties.PREFIX)
  2. public class CustomNacosConfigProperties extends NacosConfigProperties {
  3. @Override
  4. @PostConstruct
  5. public void init() {
  6. super.init();
  7. if (!StringUtils.isEmpty(this.getPassword())) {
  8. // 调用你的密码解密逻辑
  9. this.setPassword(yourDecryptAlgorithm(this.getPassword()));
  10. }
  11. }
  12. }

接下来我们需要将默认的配置类替换成我们自己的实现,编写一个CustomNacosBootstrapAutoConfig

  1. @Configuration
  2. @ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
  3. @Order(Ordered.HIGHEST_PRECEDENCE)
  4. public class CustomNacosBootstrapAutoConfig {
  5. @Bean
  6. @ConditionalOnMissingBean
  7. public NacosConfigProperties nacosConfigProperties() {
  8. return new CustomNacosConfigProperties();
  9. }
  10. }

我们使用@Order(Ordered.HIGHEST_PRECEDENCE)注解来保证这个配置类优先于Nacos默认的NacosConfigBootstrapConfiguration。这样一来,Spring容器中的NacosConfigPropertiesbean就替换成了能自动解密密码的实现。
之后,我们需要将CustomNacosBootstrapAutoConfig注册到Spring Cloud的bootstrap流程中。在自己项目里创建一个文件resources/META-INF/spring.factories,内容:

  1. org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  2. your.package.CustomNacosBootstrapAutoConfig

最后,我们只需将bootstrap.yaml中的spring.cloud.nacos.config.password配置项换为加密后的密码即可。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号