您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

时间:2020-08-06 11:20:38  来源:  作者:

在开发过程中,遇到问题,我们经常会使用搜索引擎来查找问题的解决方案,然后予以解决。但是有些问题一时半会搜索不到解决方案,需要自己去解决。这里分享下我解决这些问题使用的调试技巧,给大家一个解决问题的新思路!

问题描述

《我扒了半天源码,终于找到了Oauth2自定义处理结果的最佳方案!》一文中,当JWT令牌过期或者签名不正确时,我们想要自定义网关认证失败的返回结果。这个问题解决起来很简单,只需修改一行代码即可。但是当时查找解决方案确实花费了一番功夫,通过DEBUG源码才找到了Spring Security中提供的自定义配置,解决了该问题。下面讲讲我是如何通过DEBUG源码找到这个解决方案的!

解决过程

  • 首先我们需要找到一个切入点,既然问题是由于JWT令牌过期或者签名不正确才产生的,我们很容易想到RSASSAVerifier这个关键类,它的verify()方法是用来验证签名是否正确的,我们可以在该方法上面打个断点DEBUG一下,发现程序执行过程果然会经过这里,要是签名不正确会直接返回false;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 这时候我们可以查下堆栈信息,了解下这次调用的整个过程,可以看到红框以下的调用都是WebFlux里面的调用,没有参考意义,所以调用最早是从NimbusReactiveJwtDecoder类开始的;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 我们搜索下NimbusReactiveJwtDecoder在哪里被使用到了,可以找到又一个关键类ServerHttpSecurity,我们在网关的安全配置ResourceServerConfig中曾经用到过它,猜想下如果Spring Security提供了自定义配置,那估计就在这个类里面了;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 查看下ServerHttpSecurity的类注释,我们可以发现它相当于WebFlux版本的Spring Security配置;
/**
 * A {@link ServerHttpSecurity} is similar to Spring Security's {@code HttpSecurity} but for WebFlux.
 * It allows configuring web based security for specific http requests. By default it will be Applied
 * to all requests, but can be restricted using {@link #securityMatcher(ServerWebExchangeMatcher)} or
 * other similar methods.
 **/
  • 在我们网关的ResourceServerConfig中,我们曾经调用过ServerHttpSecurity的build()方法,用于生成SecurityWebFilterChain;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 让我们看看这个build()方法干了点啥,其中有段比较关键的是它调用了OAuth2ResourceServerSpec类的configure()方法;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 而OAuth2ResourceServerSpec类的configure()方法又调用了JwtSpec类的configure()方法;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 这个JwtSpec对象是不会为空的,因为我们在ResourceServerConfig中调用了OAuth2ResourceServerSpec类的jwt()方法创建了它;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • JwtSpec类的configure方法很关键,使用过滤器来进行认证是Spring Security实现认证的老套路了,于是我们找到了默认的认证过滤器BearerTokenAuthenticationWebFilter;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • BearerTokenAuthenticationWebFilter使用了OAuth2ResourceServerSpec中的entryPoint来处理认证失败,默认实现为BearerTokenServerAuthenticationEntryPoint;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 之后我们在BearerTokenAuthenticationWebFilter的filter()方法,BearerTokenServerAuthenticationEntryPoint的commence()方法上分别打个断点,来验证下,调用过程中都经过了,完全正确;
被我用烂的DEBUG调试技巧,专治各种搜索不到的问题

 

  • 也就是说我们只要把默认的认证失败处理器换成我们自定义的就行了,直接通过如下代码把OAuth2ResourceServerSpec中的entryPoint来设置成自定义的即可。
/**
 * 资源服务器配置
 * Created by macro on 2020/6/19.
 */
@AllArgsConstructor
@Configuration
@EnableWebFluxSecurity
public class ResourceServerConfig {
    private final RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
       //省略若干代码...
       //自定义处理JWT请求头过期或签名错误的结果
       http.oauth2ResourceServer().authenticationEntryPoint(restAuthenticationEntryPoint);
       //省略若干代码...
       return http.build();
    }
}

总结

对于一时找不到解决方法的问题,我推荐使用DEBUG源码的方式来解决。首先寻找一个突破口,可以从你熟悉的一些类中去寻找一个必定会执行的方法,然后打断点,进行DEBUG,从调用的栈信息中查找出关键的类,之后通过这些关键类顺藤摸瓜就能找解决方法了!



Tags:DEBUG调试   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
在开发过程中,遇到问题,我们经常会使用搜索引擎来查找问题的解决方案,然后予以解决。但是有些问题一时半会搜索不到解决方案,需要自己去解决。这里分享下我解决这些问题使用的调...【详细内容】
2020-08-06   DEBUG调试  点击:(1)  评论:(0)  加入收藏
一、思考1、什么是debug● 找茬◆ 找软件的茬◆ 发现程序的缺陷2、为什么需要debug? ● 谁都不敢保证,写的代码没有任何问题● 高效查找软件异常● 一位优秀的开发工程师◆ 20...【详细内容】
2019-08-14   DEBUG调试  点击:(72)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条