前言
Spring security的登录和注销我们大概都了解了,然后核心类我们也了解了,接下来呢还有基础的,quick start我们也做了。就缺少一次成体系的流程介绍, 本篇将会以角色扮演的形式带你深入源码了解spring security底层是怎么认证的。
认证
是什么?
小白: “认证认证到底什么是认证呢?是直接比较密码吗?”
小黑: “认证的核心就是比较用户输入的账户和数据库中已经注册过的账户的密码是否相等。根据相等的结果,才能给予用户后续一系列授权和访问操作。”
小白: “那spring security的认证是和有什么区别吗?”
小黑: 总体来看的话基本上没什么区别,说白了就是用户输入的账户和数据库中的账户进行比较就这么简单。如果细分下来的话就有下列几个步骤:
-
第一从客户端请求中拿到用户输入的账户和密码,
-
第二从数据库中拿到数据库中的账户和密码,
-
第三就是做比较。
-
最后保存认证成功的信息。
这是论证主要的步骤当然还有其他功能。比如说remember me功能之类。
小白: “那看起来还挺简单的,那spring security源码也是这么搞的吗?”
小黑: “万变不离其宗,接下来我们将以上面总结的这几个步骤进行分析,spring security源码中的这些步骤所处的源码到底是怎么实现的”
小黑: “不过在分析源码之前,需要罗列一下过滤器执行顺序的列表。”
Spring security中过滤器列表
小黑: “这些过滤器不需要记得很详细,只需要在关键时刻拿出来看看就行了。”
开始分析
直接从上图的过滤器开始分析,可以省掉很多事情。
我们可以直接看到它其实就是一个过滤器,而且是servlet的过滤器。
那么就可以找到doFilter的函数在这里AbstractAuthenticationProcessingFilter
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vZRemkX-1675433703718)(null)]
-
第一从客户端请求中拿到用户输入的账户和密码,
-
第二从数据库中拿到数据库中的账户和密码,
-
第三就是做比较。
-
最后保存认证成功的信息。
小白: “简直和我们说的过程一致, 完美”
客户端请求中拿到账户和密码
这个过程主要在这里UsernamePasswordAuthenticationFilter#attemptAuthentication
看看, 下面都是通过 request
获取的 username
和 password
的源码
从数据库中拿账户密码和密码匹配比较
这里需要进入下面源码才能看到上面的账户密码
this.getAuthenticationManager().authenticate(authRequest);
进入上面的那个函数只能看到ProviderManager
, 就能够看到前面一章节熟悉的
AuthenticationManager
和 AuthenticationManager.parent
之间的关系, 父子AuthenticationManager
关系
紧接着才会讲到我们需要的函数
AbstractUserDetailsAuthenticationProvider#authenticate
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMk4sMcq-1675433704376)(null)]
保存认证成功信息
AbstractAuthenticationProcessingFilter#successfulAuthentication
最后在附上绝杀流程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27Hcjnlx-1675433704432)(null)]
总结
没啥好总结的, 都是差不多的流程, 不过还有很多细节没讲, 不过也够了
以后看到要自定义啥, 看图就行
图片转存中…(img-gFwy01CG-1675433700954)]
最后在附上绝杀流程图
[外链图片转存中…(img-Ruk6bush-1675433700956)]
总结
没啥好总结的, 都是差不多的流程, 不过还有很多细节没讲, 不过也够了
以后看到要自定义啥, 看图就行