本篇内容主要讲解“Spring Boot怎么给配置项加密”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot怎么给配置项加密”吧!
Spring Boot内置的properties支持为我们读取properties带来了便利。Properties文件的属性主要包含两种:系统内置(包含各个starter)的属性和用户自定义的属性。系统内置的属性由项目启动之时自动加载,不需要我们编写相关加载方法,而自定义的属性需要编写载入操作。
工作中我们会遇到这样的需求:为了避免敏感信息暴露,配置文件中有些属性(比如密码)必须配置加密后的字符串。系统启动后自动根据我们自定义的解密方法解出明文。对于这样的需求,我们需要如何操作呢?
假如我们有自定义属性:
application.properties
username=paul password=$%&*(**( #加密过后的字符串
我们可以使用PostConstruct注解,在创建该bean的实例之时自动执行解密的方法。如下所示:
@Value("${password}") private String password; // 表示在创建该bean之时自动执行 @PostConstruct public void init() { // 调用我们自己的解密方法 password = PasswordUtil.decode(password); }
比如有如下所示的属性:
application.properties
spring.datasource.username=rmproject spring.datasource.password=MTJiN3JtcHJvamVjdA==
Spring数据源的密码是加密过的。但是这个属性是Spring Boot自己加载的,我们想干预它的加载过程,要比处理自己写的属性麻烦多了。
下面为大家介绍一个工具jasypt-spring-boot-starter。它可以做到在Spring Boot加载属性之前,对属性进行处理。
该项目GitHub的地址为:https://github.com/ulisesbocchio/jasypt-spring-boot
我们引入项目的dependency:
pom.xml
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency>
首先,我们需要定义一个标记,来告诉工具哪些属性是需要解密的。比方说,我们在加密的属性前增加**{cipher}**字样:
application.properties
spring.datasource.username=rmproject spring.datasource.password={cipher}MTJiN3JtcHJvamVjdA==
为了支持自定义的加密属性前缀,需要提供自己实现的EncryptablePropertyDetector类
public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector { public static final String ENCODED_PASSWORD_HINT = "{cipher}"; // 如果属性的字符开头为"{cipher}",返回true,表明该属性是加密过的 @Override public boolean isEncrypted(String s) { if (null != s) { return s.startsWith(ENCODED_PASSWORD_HINT); } return false; } // 该方法告诉工具,如何将自定义前缀去除 @Override public String unwrapEncryptedValue(String s) { return s.substring(ENCODED_PASSWORD_HINT.length()); } }
有了自定义加密属性的检测方法,我们还需要告诉工具如何进行解密操作:
public class MyEncryptablePropertyResolver implements EncryptablePropertyResolver { //自定义解密方法 @Override public String resolvePropertyValue(String s) { if (null != s && s.startsWith(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT)) { return PasswordUtil.decode(s.substring(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT.length())); } return s; } }
最后,我们需要将他们注册为bean
@SpringBootApplication // 入口类添加该注解,开启属性自动解密功能 @EnableEncryptableProperties public class DemoSpringBootApplication { // 注册这两个bean @Bean(name = "encryptablePropertyDetector") public EncryptablePropertyDetector encryptablePropertyDetector() { return new MyEncryptablePropertyDetector(); } @Bean(name = "encryptablePropertyResolver") public EncryptablePropertyResolver encryptablePropertyResolver() { return new MyEncryptablePropertyResolver(); } }
到此,大功告成,可以启动项目试试效果了。
到此,相信大家对“Spring Boot怎么给配置项加密”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。