[转载]spring-security-oauth2(三) 认证流程源码分析

本文深入剖析Spring Security的认证流程,包括自定义登陆路径、处理器及用户信息校验。通过源码分析,揭示认证结果共享机制及如何获取认证用户信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

认证流程源码分析

之前的代码中,我们自定义了登陆路径,自定义成功和失败处理器以及自定义的用户登陆信息校验,下面我们通过简单的源码分析,来把这些串联起来

  1. 认证流程处理说明
  2. 认证结果如何在多个请求之间共享
  3. 获取认证用户信息

认证处理流程说明

spring-security过滤器链

关于web中过滤器 、拦截器 、监听器区别 https://blog.youkuaiyun.com/Jintao_Ma/article/details/52972482

idea断点调试:https://blog.youkuaiyun.com/deepwishly/article/details/54645022

 表单过滤器认证流程如下:

UsernamePasswordAuthenticationFilter:表单用户名登陆过滤器

AuthenticationManager:管理所有的Provider,并选择适合的进行验证

AuthenticationProvider:验证提供者,可以自己写provider处理自己的业务场景逻辑

UserDetailsService:验证用户登陆信息

UserDetails:用户信息

Authentication:认证信息封装

下面我们进行登陆断点调试:

UsernamePasswordAuthenticationFilter 

UsernamePasswordAuthenticationToken  它实现Authentication这个认证接口

 

public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean

 AbstractUserDetailsAuthenticationProvider

 DaoAuthenticationProvider

MyUserDetailServiceImpl 确实是我们自定义的实现

AbstractUserDetailsAuthenticationProvider

 登陆验证成功后 AbstractAuthenticationProcessingFilter

 认证结果如何在多个请求之间共享

  在已经认证成功的情况下 

 SecurityContext 默策略是一个 org.springframework.security.core.context.ThreadLocalSecurityContextHolderStrategy  对象,
内部使用`ThreadLocal<SecurityContext>`来存储;ThreadLocal线程的变量,同一个线程可以读取

 SecurityContextPersistenceFilter会先查询session中是否已经认证了。出去的时候回将认证信息存入session。这样就解决了请求的共享的问题

 获取认证用户信息 

UserController,通过前面的认证信息如何在多个请求之间共享我们知道可以直接从SecurityContextHolder中获取认证信息,我们来测试下


 
 
  1. package com.rui.tiger.auth.demo.controller;
  2. import org.springframework.security.core.Authentication;
  3. import org.springframework.security.core.context.SecurityContext;
  4. import org.springframework.security.core.context.SecurityContextHolder;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. /**
  9. * 用户控制器
  10. *
  11. * @author CaiRui
  12. * @date 2018-12-6 8:16
  13. */
  14. @RestController
  15. @RequestMapping( "/user")
  16. public class UserController {
  17. @RequestMapping( "/hello")
  18. public String hello() {
  19. return "Hello,World";
  20. }
  21. /**
  22. *获取用户认证信息
  23. * @return
  24. */
  25. @GetMapping( "authentication")
  26. public Authentication getCurrentAuthentication(){
  27. return SecurityContextHolder.getContext().getAuthentication();
  28. }
  29. /**
  30. * 获取用户认证信息
  31. * 同getCurrentAuthentication spring 会帮我们注入
  32. * @param authentication
  33. * @return
  34. */
  35. @GetMapping( "authentication/auto")
  36. public Authentication getCurrentAuthentication2(Authentication authentication){
  37. return authentication;
  38. }
  39. }
首先进入登陆界面,登录成功后我们再输入http://localhost:8070/user/authentication可以看到成功获取到认证信息

 
 

序列化格式看下

 有时我们只想看到认证主体信息可以这样设置 使用参数注解@AuthenticationPrincipal UserDetails userDetails 获取User的信息

ok基于源码分析的 我们就先到这里,下一章我们将开发通用的验证码登陆

 

 

文章转载至:https://blog.youkuaiyun.com/ahcr1026212/article/details/84918149

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值