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)


相关推荐

  • Docker核心技术学习笔记

    Docker核心技术文章目录Docker核心技术一 、Docker简介二、Docker安装前提说明Docker 的基本组成安装centos 7 安装docker启动hello-world底层原理三、Docker常用命令帮助命令镜像命令容器命令总结四、Docker 镜像**1、镜像是什么?****2、镜像特点****3、Docker镜像commit操作补充**4 、镜像生成的途径5、 镜像导入导出…

  • java如何生成uuid_前端生成uuid

    java如何生成uuid_前端生成uuidjavauuid

  • vmware中安装centos_虚拟机系统安装教程

    vmware中安装centos_虚拟机系统安装教程一、前言最近有网友反应初学Linx不会安装,找了许多教程不是太全面,总会遇到一些要不是启动不了,要不是连不上网,各种问题,为了让大家能够顺利的安装,小乐写了一个非常详细的教程,让大家少入坑。二、背

  • 华为云服务器手机密码找回,忘记华为账号密码怎么办?两招就能帮你解决

    华为云服务器手机密码找回,忘记华为账号密码怎么办?两招就能帮你解决每天跟我们生活息息相关的账号密码,实在是太多太多了。银行卡密码、支付密码、游戏账号密码、各种APP账号密码等等……账号密码太多,也导致了我们有时候会忘记某些账号密码。那么问题来了,如果忘记了华为账号密码,怎么破?别担心,官维君教大家两招如何找回密码,一起来看看吧!第一招:登录华为云服务官网找回密码登录华为云服务官网☛https://cloud.huawei.com/,点击“忘记密码”,然后根据提示…

  • 【技巧帖】关于Mac如何内录电脑内部声音[通俗易懂]

    【技巧帖】关于Mac如何内录电脑内部声音[通俗易懂]最近见到好多人想内录Mac的声音无奈自带QuickTime或者其他录屏软件不能内录,那我来稍微说一下我当时折腾找出的方法。大神们应该都知道吧。【soundflower】!这是一个神奇的插件,可以将电脑的音频从电脑内部发出来【不是到外部】,这样在录入声音时,设备选择soundflower(2ch),就可以录入电脑声音了!下载地址:Soundflower-2.0b2.dmg步骤如下:1.安装好后,来到…

  • linux网卡的fec功能,网络控制器驱动程序学习记录fec(1)

    linux网卡的fec功能,网络控制器驱动程序学习记录fec(1)1,首先从模块加载函数module_init(fec_enet_module_init);staticint__initfec_enet_module_init(void){structnet_device*dev;inti,j,err;DECLARE_MAC_BUF(mac);printk(“FECENETVersion0.2\n”);for(i=0;(i<…

发表回复

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

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