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函数,在这里将进行重定向到原请求路径。

进入登录示意图:

登录验证失败示意图:

登录验证成功示意图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值