当前位置: 首页 > news >正文

Spring Security认证源码解析(示意图)

 建议先看完Spring Security总体架构介绍和Spring Security认证架构介绍,然后从FilterChainProxy的doFilterInternal函数开始,配合文章进行debug以理解Spring Security认证源码的执行流程。


在之前的Spring Security认证架构介绍中,我们已经知道,直接访问一个资源默认的大致流程是:

  1. 用户发送资源请求(资源需要认证)。后端保存请求并重定向到login登录界面。(实际流程为匿名用户在AnonymousAuthenticationFilter获得一个匿名身份,然后在AuthorizationFilter过滤器中验证权限,抛出一个AccessDeniedException异常,该异常被ExceptionTranslationFilter捕获并调用handleAccessDeniedException函数处理,该函数中判断,如果是匿名用户,就会保存请求,并重定向到登录页面。)
  2. 用户进入认证界面,并发送表单进行登录。
  3. 表单请求进入FilterChain,并在UsernamePasswordAuthenticationFilter进行验证。(实际流程为FilterChainProxy调用UsernamePasswordAuthenticationFilter继承的父类AbstractAuthenticationProcessingFilter的过滤方法doFilter,doFilter再调用重写的过滤器类的attemptAuthentication函数)
  4. UsernamePasswordAuthenticationFilter处理流程(即attemptAuthentication函数逻辑):
    1. 从表单中获得username和password,封装成UsernamePasswordAuthenticationToken。
    2. 使用AuthenticationManager(实现类为ProviderManager)验证UsernamePasswordAuthenticationToken。
    3. 验证失败:ProviderManager抛出异常,信息为“用户名或密码错误”,被UsernamePasswordAuthenticationFilter捕获(实际是父类AbstractAuthenticationProcessingFilter的过滤方法doFilter下的异常处理机制),UsernamePasswordAuthenticationFilter调用AuthenticationFailureHandler类(实现类为SimpleUrlAuthenticationFailureHandler)的onAuthenticationFailure方法,onAuthenticationFailure方法保存原请求,将错误信息保存到response中然后应用themeleaf设置到动态网页,并重定向到/login?error。
    4. 验证成功:ProviderManager调用DefaultAuthenticationEventPublisher发布一个AuthenticationSuccessEvent事件,然后清除Token中Credentials信息;之后返回到UsernamePasswordAuthenticationFilter,更新认证到用户的会话信息,然后调用successfulAuthentication,将认证存入SecurityContext,调用rememberMeServices的loginSuccess,调用ApplicationContext(AnnotationConfigServletWebServerApplicationContext)发送一个InteractiveAuthenticationSuccessEvent事件,然后调用SavedRequestAwareAuthenticationSuccessHandler的onAuthenticationSuccess函数,在这里将进行重定向到原请求路径。

进入登录示意图:

登录验证失败示意图:

登录验证成功示意图:

http://www.lryc.cn/news/204154.html

相关文章:

  • 2023.10.22 关于 定时器(Timer) 详解
  • 【STM32】GPIO控制LED(寄存器版)
  • Spring Boot OAuth 2.0整合—高级配置
  • 软考-虚拟专用网原理与应用
  • clock_property 时钟的常用属性
  • 平板有必要买触控笔吗?推荐的ipad手写笔
  • Qt扫描-QMoive 理论总结
  • 类似东郊到家预约家政保洁小程序搭建
  • [补题记录] Atcoder Beginner Contest 325(E、F)
  • 1024啊啊啊啊啊啊
  • 淘宝商品详情API接口(H5端和APP端),淘宝详情页,商品属性接口,商品信息查询
  • JVM的几个面试重点
  • [yolo系列:YOLOV7改进-添加CoordConv,SAConv.]
  • 【万字实操】可视化运维平台openGauss Datakit,带你轻松玩转openGauss 5.0
  • 《动手学深度学习 Pytorch版》 10.1 注意力提示
  • C# 写入文件比较
  • 医院设备利用(Use of Hospital Facilities, ACM/ICPC World Finals 1991, UVa212)rust解法
  • 解决github ping不通的问题(1024程序员节快乐!
  • QT基础 柱状图
  • 微机原理与接口技术-第七章输入输出接口
  • YoloV8改进策略:独家原创,LSKA(大可分离核注意力)改进YoloV8,比Transformer更有效,包括论文翻译和实验结果
  • 7天易语言从入门到实战(一)
  • redis缓存问题
  • mysql创建自定义函数报错
  • Docker 的数据管理与网络通信以及Docker镜像的创建
  • linux系统查看bash的history
  • 【T+】畅捷通T+增加会计科目提示执行超时已过期。
  • 0基础学习VR全景平台篇第111篇:全景图拼接和编辑 - PTGui Pro教程
  • Dynamics 365 使用ILMerge 合并CRM开发后的DLL
  • SpringBoot Web请求响应