如安在Spring Cloud中实现Nacos客户端登录密码加密

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

背景

公司规范要求配置文件里不能出现明文的密码。近来项目引入了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就替换成了能自动解密密码的实现。
最后,我们只需将bootstrap.yaml中的spring.cloud.nacos.config.password配置项换为加密后的密码即可。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表