1.使用ModelMapper的源码一次踩坑经历
2.OAuth2.0实战!使用JWT令牌认证!源码
使用ModelMapper的源码一次踩坑经历
在项目实践中,我们经常会遇到将两个相似对象进行相互转换的源码需求,这主要是源码为了在对外提供数据时,能够隐藏部分敏感信息,源码lpr程序源码如密码、源码加密token等。源码一般情况下,源码我们会创建一个新的源码对象,然后逐个将需要的源码值设置进去。但如果需要转换的源码对象组较多,这种做法会带来大量无意义的源码get/set操作。
在这种情况下,源码ModelMapper应运而生。源码它是一个简单、高效、z站源码智能的对象映射工具。使用ModelMapper非常简便,只需添加maven依赖,然后创建一个ModelMapper对象,并调用其map方法将一个对象的值映射到另一个对象上。
关于ModelMapper的使用方法,今天不做详细介绍,大家可以自行查找相关文档进行学习。今天要分享的是前几天我无意间遇到的一个问题。我有两个类,PostDO和PostVO(以下只展示部分字段),我在一个方法中尝试将PostDO对象映射到PostVO。
执行结果没有出现异常,但当我项目中likeNum字段的值增加到2时,异常出现了。提示信息显示int类型不能转换成boolean类型,map keyset源码很明显是ModelMapper将like字段映射到了likeNum上。那么ModelMapper是如何进行映射的呢?让我们一起来看看ModelMapper的源码。
ModelMapper通过反射机制获取目标类的字段,并生成期望匹配的键值对,类似于这样。然后,它会遍历这些键值对,逐个寻找源类中可以匹配的字段。首先会根据目标字段判断是否存在对应的映射,如果不存在,则调用matchSource方法在源类中根据匹配规则寻找可以匹配的字段。
在匹配过程中,首先会判断目标字段的类型是否在类型列表中存在,如果存在,则可以根据名称将其加入到匹配的mappings中。如果不存在,小米电视源码则需要判断converterStore中是否存在能够应用于该字段的转换器。
默认的转换器有种。找到对应的converter后,它的map方法会返回一个MatchResult,MatchResult有三种结果:FULL、PARTIAL和NONE(即全部匹配、部分匹配和不匹配)。注意,这里有一个部分匹配,也就是我遇到的问题。在对like进行匹配时,likeNum被定义为部分匹配。因此,当likeNum大于2时,就不能被转换成boolean类型。
解决方法有两种:一种是交友 诱导 源码在设置中规定必须字段名完全匹配;另一种是将匹配策略定义为严格。
ModelMapper会根据权重选择合适的源字段,但如果匹配要求不高,ModelMapper可能会筛选出多个符合条件的字段,因此,还需要进一步过滤。
如果匹配到的结果只有一个,就返回这个结果;如果有多个,则会调用disambiguateMappings方法,去掉有歧义的结果。我们来看一下这个方法。
ModelMapper定义了一个权重来判断源字段是否有歧义,这里根据驼峰式规则(也可以设置为下划线)将源和目标字段名称进行拆分,根据匹配数量/源token数+目标token数,得到一个匹配的比率。比率越大,说明匹配度越高。最终,取得匹配权重最大的那个字段,其他字段被认为是有歧义的。
至此,ModelMapper的map方法的工作原理已经介绍完毕。中间可能有些遗漏的细节,或者有地方没有说清楚,欢迎大家和我一起讨论。在使用ModelMapper时,一定要注意字段名,如果有相近的字段名,必须认真核对匹配是否正确,必要时就采用严格匹配策略。
OAuth2.0实战!使用JWT令牌认证!
本文介绍OAuth2.0集成JWT颁发令牌的实践,这是企业中应用广泛的令牌形式。
OAuth2.0中的令牌分为透明和不透明两种类型。不透明令牌是仅包含随机字符串,如UUID,资源服务需调用认证授权服务的接口进行校验,导致高并发下性能低下。相比之下,透明令牌如JWT,直接存储用户信息,资源服务可自行解析,无需额外调用校验接口。
JWT由三部分构成:头部、载荷和签名。头部定义令牌基本信息,如类型和加密算法。载荷包含用户信息等元数据。签名部分使用头部定义的算法结合密钥生成,确保数据完整性和安全性。
在OAuth2.0认证授权服务搭建中,JWT作为透明令牌,简化了令牌验证过程。首先,创建oauth2-auth-server-jwt模块,继承并修改上文关于OAuth2.0的代码。配置JWT相关的类,包括令牌增强类、令牌存储策略和签名密钥。使用JwtAccessTokenConverter进行JWT和OAuth身份转换,配置TokenStore为JWT生成方式,同时注意在实际应用中应使用非对称加密以增强安全性。
接下来,为授权服务配置令牌管理,使用DefaultTokenServices实现,设置令牌过期时间,并通过JWT方式生成访问令牌。在AuthorizationServerEndpointsConfigurer中添加令牌服务。至此,认证中心JWT令牌生成方式配置完成。
资源服务方面,构建oauth2-auth-resource-jwt模块,复用授权服务的配置,注意JWT加密密钥需与认证中心一致。配置令牌服务,生成ResourceServerTokenServices对象,结合JWT增强。将资源ID和令牌服务配置到ResourceServerSecurityConfigurer中,以实现资源访问。
测试阶段,通过获取令牌并调用资源服务接口验证逻辑是否正确。使用POSTMAN请求获取访问令牌,并使用获取的访问令牌调用资源服务接口进行测试。JWT令牌验证成功。
源码追踪环节,解析获取令牌和校验令牌的过程。获取令牌主要在TokenEndpoint处理,通过ClientDetailsService加载客户端信息,使用DefaultTokenServices生成并返回OAuth2AccessToken。校验令牌则在OAuth2AuthenticationProcessingFilter中完成,调用OAuth2AuthenticationManager的authenticate()方法实现令牌验证。