Spring Security是怎么用你的账号密码认证的

前言

Spring security的登录和注销我们大概都了解了,然后核心类我们也了解了,接下来呢还有基础的,quick start我们也做了。就缺少一次成体系的流程介绍, 本篇将会以角色扮演的形式带你深入源码了解spring security底层是怎么认证的。

认证

是什么?

小白: “认证认证到底什么是认证呢?是直接比较密码吗?”

小黑: “认证的核心就是比较用户输入的账户和数据库中已经注册过的账户的密码是否相等。根据相等的结果,才能给予用户后续一系列授权和访问操作。”

小白: “那spring security的认证是和有什么区别吗?”

小黑: 总体来看的话基本上没什么区别,说白了就是用户输入的账户和数据库中的账户进行比较就这么简单。如果细分下来的话就有下列几个步骤:

  • 第一从客户端请求中拿到用户输入的账户和密码,

  • 第二从数据库中拿到数据库中的账户和密码,

  • 第三就是做比较。

  • 最后保存认证成功的信息。

这是论证主要的步骤当然还有其他功能。比如说remember me功能之类。

小白: “那看起来还挺简单的,那spring security源码也是这么搞的吗?”

小黑: “万变不离其宗,接下来我们将以上面总结的这几个步骤进行分析,spring security源码中的这些步骤所处的源码到底是怎么实现的”

小黑: “不过在分析源码之前,需要罗列一下过滤器执行顺序的列表。”

Spring security中过滤器列表

image-20221113045141957

image-20221113045206974

小黑: “这些过滤器不需要记得很详细,只需要在关键时刻拿出来看看就行了。”

开始分析

image-20221229182727351

直接从上图的过滤器开始分析,可以省掉很多事情。

image-20221229182817884

我们可以直接看到它其实就是一个过滤器,而且是servlet的过滤器。

那么就可以找到doFilter的函数在这里AbstractAuthenticationProcessingFilter

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vZRemkX-1675433703718)(null)]

  • 第一从客户端请求中拿到用户输入的账户和密码,

  • 第二从数据库中拿到数据库中的账户和密码,

  • 第三就是做比较。

  • 最后保存认证成功的信息。

小白: “简直和我们说的过程一致, 完美”

客户端请求中拿到账户和密码

这个过程主要在这里UsernamePasswordAuthenticationFilter#attemptAuthentication

image-20221229210730331

看看, 下面都是通过 request 获取的 usernamepassword 的源码

image-20221229210821248

从数据库中拿账户密码和密码匹配比较

这里需要进入下面源码才能看到上面的账户密码

this.getAuthenticationManager().authenticate(authRequest);

进入上面的那个函数只能看到ProviderManager, 就能够看到前面一章节熟悉的

AuthenticationManagerAuthenticationManager.parent 之间的关系, 父子AuthenticationManager关系

紧接着才会讲到我们需要的函数

AbstractUserDetailsAuthenticationProvider#authenticate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMk4sMcq-1675433704376)(null)]

image-20221229220652411

保存认证成功信息

AbstractAuthenticationProcessingFilter#successfulAuthentication

image-20221229214812220

最后在附上绝杀流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27Hcjnlx-1675433704432)(null)]

总结

没啥好总结的, 都是差不多的流程, 不过还有很多细节没讲, 不过也够了

以后看到要自定义啥, 看图就行

图片转存中…(img-gFwy01CG-1675433700954)]

最后在附上绝杀流程图

[外链图片转存中…(img-Ruk6bush-1675433700956)]

总结

没啥好总结的, 都是差不多的流程, 不过还有很多细节没讲, 不过也够了

以后看到要自定义啥, 看图就行

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值