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方法对加密内容解密,最后返回解密之后的值。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css3 flex布局的使用 图片文字垂直居中排列 图文混排垂直居中 display:flex「建议收藏」

    css3 flex布局的使用 图片文字垂直居中排列 图文混排垂直居中 display:flex「建议收藏」遇到的问题在实际工作的过程中经常遇到图片文字的混排,需要图片与一段文字垂直居中,这个实现方法以前一直非常复杂,而flex是解决这个问题比较好的办法;css代码display:flex;flex的是Flexible的缩写,意为弹性。可以在单行或者多行的盒状模型中提供很好的灵活性,所以它也是自适应友好的。图文混排垂直居中基本用法用flex实现文字和图片在同一行的时候的垂…

    2022年6月9日
    99
  • 面试 SQL整理 常见的SQL面试题:经典50题

    面试 SQL整理 常见的SQL面试题:经典50题目录​SQL基础知识整理:常见的SQL面试题:经典50题三、50道面试题2.汇总统计分组分析3.复杂查询sql面试题:topN问题4.多表查询【面试题类型总结】这类题目属于行列如何互换,解题思路如下:其他面试题:SQL基础知识整理:select查询结果如:[学号,平均成绩:组函数avg(成绩)]from从哪张表中查找数…

    2022年5月20日
    26
  • 2021了,真的不要再说 Node.js 是一门编程语言了「建议收藏」

    2021了,真的不要再说 Node.js 是一门编程语言了「建议收藏」Node.js全栈基础1.Node.js光速入门1.1Node.js概述Node.js是什么Node.js不是一门编程语言,它是一个执行JavaScript代码的工具。工具是指可以安装在计算机操作系统之上的软件。为什么浏览器和Node.js都可以运行JavaScript因为浏览器和Node.js都内置了JavaScriptV8Engine。它可以将JavaScript代码编译为计算机能够识别的机器码。3.浏览器中运行的JavaScrip

    2022年7月16日
    13
  • python unicode编码转换utf-8编码_不成问题的问题人物解析

    python unicode编码转换utf-8编码_不成问题的问题人物解析Unicode也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。对于世界上所有的语言文字再unicode中都可以查看到。【汉】字的编码解释官网https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=6C49unicode编码就是为了统一世界上的编码,有一个统一的规范。但是它还存在一些问题。Unicode的问题需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存

    2022年9月30日
    0
  • 常微分方程初值问题数值解法MATLAB(泛函微分方程)

    Matlab解常微分方程的初值问题题目:Matlab解常微分方程的初值问题设计目的:1、熟练掌握Matlab的基本编程方法,及其编程风格。2、熟练掌握Matlab常用函数的使用。3、与本专业相关知识相结合,掌握其在程序开发中的应用方法以及和word、C语言等接口方法。4、通过计算机数值求解的方式来加深微分方程解的理解。5、熟悉初等方法可获得解析解之外的数值近似解的求解方法,提高对差分格式的认识…

    2022年4月12日
    187
  • matlab ga算法_基因算法和遗传算法

    matlab ga算法_基因算法和遗传算法遗传算法(GeneticAlgorithm,GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解(所找到的解是全局最优解)的方法。参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。1)种群初始化。我们需要首先通过随机生成的方式来创造一个种群,一般该种群的数量为100…

    2022年10月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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