jasypt 原理_litmp试剂

jasypt 原理_litmp试剂文章目录一、jasypt的启动类加载二、jasypt中Encryptor、Detector和Resolver加载三、jasypt中EnableEncryptablePropertiesBeanFactoryPostProcesso四、proxy代理方式增强propertySources五、wrapper包装类方式增强propertySources六、resolver中属性值解密作者:史佳健推荐理由:文章详尽并有对应分析说明一、jasypt的启动类加载引入了jasypt-spring-boot-st

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

作者:史佳健

推荐理由:文章详尽并有对应分析说明

一、jasypt的启动类加载

引入了jasypt-spring-boot-starter的jar包之后,项目启动的时候,是如何加载jasypt的呢? 这利用的是项目启动类上的一个注解@SpringBootApplication,这个注解中引用了@EnableAutoConfiguration注解。

这个注解又引入了继承了AutoConfigurationImportSelector类的EnableAutoConfigurationImportSelector类,在AutoConfigurationImportSelect类中提供了getCandidateConfigurations方法。在该方法中,

从classpath中搜索所有META-INF/spring.factories配置文件。然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器中。这样就实现了在spring boot中加载外部项目的bean或者第三方jar中的bean。

这里jasypt-spring-boot-starter加载的就是类com.ulisesbocchio.jasyptspringboot.JasyptSpringBootAutoConfiguration。

二、 jasypt中Encryptor、Detector和Resolver加载

jasypt-spring-boot-starter中的启动类JasyptSpringBootAutoConfiguration,注解了@Import(EnableEncryptablePropertiesConfiguration.class)。先加载EnableEncryptablePropertiesConfiguration类。

这个类主要是用来加载lazyJasyptStringEncryptor、lazyEncryptablePropertyDetector和lazyEncryptablePropertyResolver。这些类在加载的时候,都是先从bean工厂中获取对应的对象,如果获取不到就创建默认对象。

这样做是为了方便我们扩展,可以自定义Encryptor、Detector和Resolver类。比如自定义StringEncryptor
在这里插入图片描述

三、jasypt中EnableEncryptablePropertiesBeanFactoryPostProcesso

EnableEncryptablePropertiesConfiguration类中,创建了EnableEncryptablePropertiesBeanFactoryPostProcessor对象,这个类实现了BeanFactoryPostProcessor接口、ApplicationListener接口和Ordered接口。

实现了BeanFactoryPostProcessor,重写其中的postProcessBeanFactory方法,可以在容器初始化完成之后执行重写后的postProcessBeanFactory方法,实现Ordered接口,重写其中的getOrder方法,

可以用来指定在多个实现BeanFactoryPostProcessor类中的执行顺序,比如返回Ordered.LOWEST_PRECEDENCE,就是指初始化顺序最低,即最后初始化,也就是说表明在容器初始化完成之后,最后执行该类中的postProcessBeanFactory。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述EnableEncryptablePropertiesBeanFactoryPostProcessor类中,实现BeanFactoryPostProcessor,重写的postProcessBeanFactory方法。 该方法中的主要逻辑就是,获取所有的propertySources。

然后过滤出所有的不是EncrytablePropertySource,然后通过makeEncryptable方propertySource对象法,将所有通过jasypt加密的配置项的propertySources替换成拥有加解密功能的对象。可以通过代理和包装来增强propertySources。

可以通过配置项来指定增强方式。一般默认的是包装类的方式
在这里插入图片描述
在创建EnableEncryptablePropertiesBeanFactoryPostProcessor对象的时候,就通过jasypt.encryptor.proxyPropertySources配置项来指定propertySource的增强方式,默认是wrapper包装类的方式。 可以修改为代理方式。

四、proxy代理方式增强propertySources

在这里插入图片描述上面就是makeEncryptable方法中,通过proxy代理的方式增强propertySources对象,在调用propertySources中的方法的时候,通过EncryptablePropertySourceMethodInterceptor对象中的invoke方法进行代理。

创建EncryptablePropertySourceMethodInterceptor对象的两个入参,第一个就是被代理对象,第二个就是真正执行获取属性getProperty方法的EncryptablePropertyResolver,可以在获取属性的时候,对通过jasypt加密的属性进行解密。
在这里插入图片描述在这里插入图片描述上面就是EncryptablePropertySourceMethodInterceptor对象中的invoke方法。主要是先保证,代理的方法是getProperty方法,然后通过EncryptablePropertySourceMethodInterceptor实现的EncryptablePropertySource接口中的

默认方法 default Object getProperty(EncryptablePropertyResolver resolver, PropertySource source, String name)方法,来获取指定属性解密之后的值。在另外一种增强方式Wrapper包装方式中,最终使用的也是该接口中的这个默认方法。

五、wrapper包装类方式增强propertySources

在这里插入图片描述在这里插入图片描述
上面就是makeEncryptable方法中,通过wrapper包装类增强propertySources的方式。给不同类型的propertySources进行不同的包装。实现增强的方式,主要是通过重写包装类继承PropertySources中的getProperty方法,

在重写的方法中,调用所实现的EncrytablePropertyResoler接口中的那个getProperty默认方法。
在这里插入图片描述EncrytablePropertyResoler接口中的默认方法getProperty。先通过原本的propertySources对象,获取配置文件中加密之后的指定属性的值。先判断是字符串类型的(加密之后一般都是字符串类型的)。

然后通过EncrytablePropertyResolver对象中的resolvePropertyValue方法,将加密的属性值解密。最后返回解密之后的值。

六、resolver中属性值解密

在这里插入图片描述
在这里插入图片描述
上面是默认的DefaultPropertyResolver对象中的resolvePropertyValue方法。在方法中先是通过EncryptablePropertyDetector对象的isEncrypted方法来判断传入的属性值,是否被加密,判断逻辑是该值是否是以配置的前缀和后缀来开头和结尾的。

如果是,那么就认为是加密之后的值。然后再将值截取前缀和后缀,通过StringEncryptor对象的decrypt方法对加密内容解密,最后返回解密之后的值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189438.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号