SpringSecurity源码解析(一)

这里用的是springsecurity默认的表单提交方式

下面这张图片是采用默认的表单提交方式的一个拦截器的链。
在这里插入图片描述

  1. 首先是经过的第一个类UsernamePasswordAuthenticationFilter(前面的我就不说了,第二个是一个基于请求头处理的拦截器、第3个是退出登录的拦截器。前两个我也没有细细研究),但是呢,他继承了AbstractAuthenticationProcessingFilter 这个抽象类中,所以要先执行父类中的的 doFilter这个方法,实际上来说这个就是spring里面实现拦截器的一个类。
  2. 在这里插入图片描述
    重点看这个地方。这个地方实现的就是我们进行认证的方法逻辑代码。
    打断点就去就看到了我们实现认证的逻辑代码。
    在这里插入图片描述

2.1 首先先从request请求中拿到username和password密码,然后生成一个对象UsernamePasswordAuthenticationToken 相当于是一个临时存储用户名和密码的地方。
在这里插入图片描述
2.2 然后就进入到这个this.getAuthenticationManager().authenticate(authRequest) 这个方法里面。首先我们要想到这个地方我们是要做什么,对不,因为上一步已经拿到了前端传过来的参数了并且已经把他封装了起来,这里不就是轮到解析了嘛。这里用到的解析是AuthenticationManager,这是一个接口,而他默认的实现类是ProviderManager这个实现类。就是用来处理认证UsernamePasswordAuthenticationToken 这个对象的。
首先和大家说一点。他这里的处理这个对象Authentication的处理类有很多。如何判断是哪个类去处理UsernamePasswordAuthentication呢,

下面的是一个处理类的公共接口的一个说明
在这里插入图片描述
那么我们来看一下他的默认实现类DaoAuthenticationProvider,如果大家看到这个类,可能会发现,在这个类里面我们并没有找到这个supports.这个方法,也没有找到他实现的认证的方法。而且他实现的并不是AuthenticationProvider这个接口,而是继承了一个叫AbstractUserDetailsAuthenticationProvider这个类,那么我们就到这个类里面看一下。咦,找到这个方法了,
在这里插入图片描述
就是这里,说明这个认证处理器是用来处理UsernamePasswordAuthenticationToken这个类的。所以我们用到的处理器,是这个AbstractUserDetailsAuthenticationProvider类的实现类。DaoAuthenticationProvider。所以我们再接着上面看。进入到下面得图得方法。
在这里插入图片描述

  1. 此时我们进入到AbstractUserDetailsAuthenticationProvider中的authenticate方法。因为DaoAuthenticationProvider这个处理器是实现的AbstractUserDetailsAuthenticationProvider,所以才会先进入到AbstractUserDetailsAuthenticationProvider,而不是DaoAuthenticationProvider,但是这里调用的类是默认实现类DaoAuthenticationProvider。
    下面是调用AbstractUserDetailsAuthenticationProvider的authenticate方法。(下面图片中authentication写错了,应该是返回的一个UserDetails)
    在这里插入图片描述
    这个地方就是DaoAuthenticationProvider的retrieveUser。可以这么认为,这个方法就是拿到在数据库中的当前该用户名的信息。
    在这里插入图片描述
    而具体的实现类。就是我们在使用这个框架的时候必须实现的一个接口。UserDetailsService。这个接口
    在这里插入图片描述

  2. 走完retrieveUser这个方法后,就进入到additionalAuthenticationChecks这个方法。而这个方法在抽象类AbstractUserDetailsAuthenticationProvider也是没有实现的,而是在实现类中DaoAuthenticationProvider进行实现的。
    在这里插入图片描述
    下面就是DaoAuthenticationProvider中的实现方法。
    在这里插入图片描述
    然后比对完成后就基本没有什么了。就是在返回结果处,把比对结果是相同的用户进行重新创建,进行存储。
    在这里插入图片描述

  3. 我们接着上面中返回结果的那个方法createSuccessAuthentication打断点的看。就是下面的方法。
    在这里插入图片描述
    然后在一步步的打断点。就把封装好的Authentication给返回到步骤2中的第一张图里面了。

  4. 这里我们在接着上面的步骤2中的图进行打断点进行查看
    在这里插入图片描述
    接着下面的this.sessionStrategy.onAuthentication这个方法,这个方法的目的就是在于,下次请求进来的时候,我们就可以通过sessionid,直接拿到用户信息。完成验证用户。这个方法可以理解为保存用户信息。
    在这里插入图片描述

这里我们着重查看successfulAuthentication这个方法。
在这里插入图片描述
然后就一步步的进行返回了,基本的认证流程就是这个样子了。

下面就是继续将,在我们登录过来,接下来的请求我们是如何判断他是已经认证过的。可以通过的了。

猜测就是在刚才存session那个地方。存了一个session的标识,然后从已经登录的列表中判断是否存在当前用户,进行判断,明天继续看。

Spring Security 是一个功能强大且广泛使用的安全框架,用于保护 Java 应用程序的身份验证和授权。它提供了一套全面的安全解决方案,包括认证、授权、攻击防护等功能。 Spring Security源码是开源的,可以从官方仓库(https://github.com/spring-projects/spring-security)获取到。在源码中,主要包含以下几个关键模块: 1. 核心模块(Core):提供了基本的认证和授权功能,包括用户身份认证、访问控制等。核心模块的源码位于 `spring-security-core` 包下。 2. Web 模块(Web):提供了与 Web 应用程序集成的相关功能,如基于 URL 的授权、Web 表单登录、记住我功能等。Web 模块的源码位于 `spring-security-web` 包下。 3. 配置模块(Config):提供了基于 Java 配置和 XML 配置的方式来配置 Spring Security。配置模块的源码位于 `spring-security-config` 包下。 4. 测试模块(Test):提供了用于测试 Spring Security 的工具和辅助类。测试模块的源码位于 `spring-security-test` 包下。 在源码中,你可以深入了解 Spring Security 的内部工作原理、各个组件之间的协作关系以及具体的实现细节。可以通过跟踪调试源码,了解每个功能是如何实现的,从而更好地理解和使用 Spring Security。 请注意,Spring Security源码是非常庞大且复杂的,需要一定的时间和精力去深入研究。建议在阅读源码之前,先对 Spring Security 的基本概念和使用方法有一定的了解,这样会更有助于理解源码中的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值