背景

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

基本的bootstrap.yaml配置如下:

spring:
cloud:
nacos:
config:
server-addr: <host>:<port>
prefix: application
group: shared
namespace: xxx
file-extension: yaml
username: user
password: plain_text_password
......

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

研究

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

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

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

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
public class NacosConfigBootstrapConfiguration { @Bean
@ConditionalOnMissingBean
public NacosConfigProperties nacosConfigProperties() {
return new NacosConfigProperties();
}
......
}

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

按图索骥,我们观察NacosConfigProperties的实现:

@ConfigurationProperties(NacosConfigProperties.PREFIX)
public class NacosConfigProperties { public static final String PREFIX = "spring.cloud.nacos.config"; ...... @Autowired
@JsonIgnore
private Environment environment; @PostConstruct
public void init() {
this.overrideFromEnv();
} private void overrideFromEnv() {
if (StringUtils.isEmpty(this.getServerAddr())) {
String serverAddr = environment
.resolvePlaceholders("${spring.cloud.nacos.config.server-addr:}");
if (StringUtils.isEmpty(serverAddr)) {
serverAddr = environment.resolvePlaceholders(
"${spring.cloud.nacos.server-addr:localhost:8848}");
}
this.setServerAddr(serverAddr);
}
if (StringUtils.isEmpty(this.getUsername())) {
this.setUsername(
environment.resolvePlaceholders("${spring.cloud.nacos.username:}"));
}
if (StringUtils.isEmpty(this.getPassword())) {
this.setPassword(
environment.resolvePlaceholders("${spring.cloud.nacos.password:}"));
}
}
......
}

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

实现

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

@ConfigurationProperties(NacosConfigProperties.PREFIX)
public class CustomNacosConfigProperties extends NacosConfigProperties { @Override
@PostConstruct
public void init() {
super.init();
if (!StringUtils.isEmpty(this.getPassword())) {
// 调用你的密码解密逻辑
this.setPassword(yourDecryptAlgorithm(this.getPassword()));
}
}
}

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

@Configuration
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomNacosBootstrapAutoConfig { @Bean
@ConditionalOnMissingBean
public NacosConfigProperties nacosConfigProperties() {
return new CustomNacosConfigProperties();
}
}

我们使用@Order(Ordered.HIGHEST_PRECEDENCE)注解来保证这个配置类优先于Nacos默认的NacosConfigBootstrapConfiguration。这样一来,Spring容器中的NacosConfigPropertiesbean就替换成了能自动解密密码的实现。

之后,我们需要将CustomNacosBootstrapAutoConfig注册到Spring Cloud的bootstrap流程中。在自己项目里创建一个文件resources/META-INF/spring.factories,内容:

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

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

如何在Spring Cloud中实现Nacos客户端登录密码加密的更多相关文章

  1. Spring Cloud Alibaba(2)---Nacos概述

    Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  2. Spring Cloud Alibaba(4)---Nacos(注册中心)

    Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...

  3. Spring Cloud Alibaba(5)---Nacos(配置中心)

    Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...

  4. Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本

    Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...

  5. Spring Cloud Alibaba(3)---Nacos概述

    Spring Cloud Alibaba(3)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  6. Spring Cloud中负载均衡器概览

    在上篇文章中(RestTemplate的逆袭之路,从发送请求到负载均衡)我们完整的分析了RestTemplate的工作过程,在分析的过程中,我们遇到过一个ILoadBalancer接口,这个接口中有一 ...

  7. Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  8. Spring Cloud中的负载均衡策略

    在上篇博客(Spring Cloud中负载均衡器概览)中,我们大致的了解了一下Spring Cloud中有哪些负载均衡器,但是对于负载均衡策略我们并没有去详细了解,我们只是知道在BaseLoadBal ...

  9. Spring Cloud中服务的发现与消费

    之前没注意,微信公众号的图片不能引用到其他地方,本文图片显示不正常,原图在写完博客后已经删了,,,,,,所以本文小伙伴可以移步这里https://mp.weixin.qq.com/s/GoIZdwt5 ...

  10. 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

随机推荐

  1. 3个月搞定计算机二级C语言!高效刷题系列进行中

    前言 大家好,我是梁国庆. 计算机二级应该是每一位大学生的必修课,相信很多同学的大学flag中都会有它的身影. 我在大学里也不止一次的想要考计算机二级office,但由于种种原因,备考了几次都不了了之 ...

  2. 消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计

    消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计 1.消息sms 邮箱/手机号/push发送的方案 1.判断收件人地址是否为空, ...

  3. 打开ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹

    产生这种现象有很多方面的原因 如果你能用命令行的方式访问ftp服务器,但是不能用资源管理器访问,那么请看下去. 1.打开IE浏览器,点击设置 2.点击Internet选项,进入高级 3.取消勾选 大功 ...

  4. python重拾第七天-面向对象进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  5. QT学习:04 代码化的界面绘制

    --- title: framework-cpp-qt-04-代码化的界面绘制 EntryName: framework-cpp-qt-04-ui-design-by-code date: 2020- ...

  6. Windows 7操作系统全面解析与实用技巧

    Win7操作系统 一.操作系统的概述 1.1操作系统的概念 操作系统(operating system,简称OS)一组控制和管理计算机系统的硬件和软件资源.控制程序执行.改善人机界面.合理地组织计算机 ...

  7. 嵌入式HLS 案例开发手册——基于Zynq-7010/20工业开发板(2)

    目 录 2 led_flash 案例 19 2.1 HLS 工程说明 19 2.2 编译与仿真 20 2.3 IP 核测试 23 3 key_led_demo 案例 23 3.1 HLS 工程说明 2 ...

  8. Excel好用的技巧

    http://www.360doc.com/content/18/0603/07/39124342_759238510.shtml

  9. typora markdown笔记

    前言 此为个人markdown笔记,不定时更新. 正文 1. mermaid 使用 横向流程图 源码 graph LR a(起始)-->b(中间) b-->c1<-->d b- ...

  10. Spring Cloud 比较

    Spring Cloud 比较 一.简介 1.SpringCloud:一套微服务架构下的一站式解决方案,理念就是解决我们在微服务架构中遇到的任何问题: 2.SpringCloudAlibaba:阿里实 ...