找回密码
 立即注册
首页 业界区 业界 Spring Security 认证流程闭环与调用链路详解 ...

Spring Security 认证流程闭环与调用链路详解

轮达 2025-11-25 18:00:04
书  接  上  回、我  们  分  析  下  AuthController.@PostMapping("/login")  接  口  作  为  切  入  点  进  行  深  入  浅  出  剖  析  ~ ~

下  面  我  们  以  小  明  的   authenticateUser   方  法  为  入  口  ,  详  细  拆  解  认  证  执  行  的  **  完  整  流  程  闭  环  **  ,  并  深  入  分  析   Authentication authentication = authenticationManager.authenticate(...)   的  **  调  用  链  路  **  ,  同  时  说  明  **  自  定  义  类  **  在  其  中  的  作  用  。  代  码  块  中  汉  字  正  常  书  写  ,  代  码  块  外  汉  字  间  保  持  2  个  空  格  。
一  、  完  整  认  证  流  程  闭  环

认  证  流  程  从  用  户  提  交  登  录  请  求  开  始  ,  到  返  回  JWT  响  应  结  束  ,  形  成  如  下  闭  环  :
graph LR    A[用户提交登录请求] --> B[接收LoginRequest参数]    B --> C[创建UsernamePasswordAuthenticationToken]    C --> D[调用AuthenticationManager.authenticate]    D --> E[DaoAuthenticationProvider处理认证]    E --> F[UserDetailsService查询用户]    F --> G[PasswordEncoder验证密码]    G --> H[构建认证后Authentication对象]    H --> I[设置SecurityContextHolder]    I --> J[JwtService生成JWT令牌]    J --> K[封装JwtResponse响应]    K --> L[返回响应给用户]        class A,B,C,D,E,F,G,H,I,J,K,L default-class流  程  闭  环  详  细  步  骤  (  结  合  代  码  )

1.  接  收  登  录  请  求  (  自  定  义  DTO  入  口  )

用  户  通  过  前  端  提  交  用  户  名  和  密  码  ,  请  求  体  被  @RequestBody LoginRequest loginRequest  接  收  。
**  自  定  义  类   LoginRequest   作  用  **  :  封  装  登  录  请  求  参  数  (  用  户  名  、  密  码  )  ,  代  码  如  下  :
  1. public class LoginRequest {  
  2.     private String username;  // 用  户  名  
  3.     private String password;  // 密  码  
  4.     // Getters and Setters  
  5. }  
复制代码
2.  创  建  认  证  请  求  对  象  (  Spring Security  自  带  类  )

通  过   new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())   创  建  认  证  请  求  对  象  。
**  Spring Security  自  带  类   UsernamePasswordAuthenticationToken   作  用  **  :

  • 来  源  :   org.springframework.security.authentication.UsernamePasswordAuthenticationToken
  • 作  用  :  封  装  用  户  名  密  码  认  证  请  求  ,  初  始  状  态  下   authorities   (  权  限  )  为  空  ,  相  当  于  “  未  盖  章  的  通  行  证  ”  。
3.  调  用   AuthenticationManager.authenticate()   (  核  心  调  用  链  路  ,  下  文  详  解  )

将  上  述   UsernamePasswordAuthenticationToken   传  入   authenticationManager.authenticate()   ,  触  发  认  证  流  程  。
4.  认  证  成  功  后  设  置  安  全  上  下  文

认  证  成  功  返  回  填  充  完  权  限  的   Authentication   对  象  ,  通  过   SecurityContextHolder.getContext().setAuthentication(authentication)   绑  定  到  当  前  线  程  。
5.  生  成  JWT  令  牌  (  自  定  义   JwtService   )

调  用   jwtService.generateToken(authentication)   生  成  JWT  ,  用  于  后  续  无  状  态  认  证  。
**  自  定  义  类   JwtService   作  用  **  :  封  装  JWT  生  成  /  验  证  逻  辑  ,  核  心  方  法   generateToken(Authentication authentication)   从   authentication   中  提  取  用  户  名  、  权  限  等  信  息  ,  按  规  则  生  成  签  名  令  牌  。
6.  封  装  响  应  数  据  (  自  定  义  DTO  )

从   authentication.getPrincipal()   获  取   UserDetailsImpl   (  自  定  义  用  户  详  情  类  )  ,  提  取  用  户  ID  、  用  户  名  、  邮  箱  、  角  色  等  信  息  ,  封  装  为   JwtResponse   返  回  。
**  自  定  义  类  作  用  **  :

  • UserDetailsImpl   :  实  现  Spring Security  的   UserDetails   接  口  ,  封  装  用  户  基  础  信  息  (  ID  、  用  户  名  、  邮  箱  )  和  权  限  (  角  色  /  权  限  字  符  串  )  ,  代  码  示  例  :
[code]public class UserDetailsImpl implements UserDetails {      private Long id;      private String username;      private String email;      private String password;      private Collection

相关推荐

2025-11-27 04:46:32

举报

您需要登录后才可以回帖 登录 | 立即注册