收起左侧

[JAVA] SpringSecurity认证流程

0
回复
[复制链接]

1

主题

-1

回帖

63

积分

发表于 2023-5-29 20:40:51 | 显示全部楼层 |阅读模式
uthentication:认证
Authorization:授权
POM依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
复制代码
图解:
Security用户认证流程.png
自然语言描述:
  • 用户提交用户名/密码 ==> 调用new UsernamePasswordAuthenticationToken(username, password)生成未认证的Authentication
  • 调用authenticationManager.authenticate(authenticationToken)认证

    • 其具体实现为:ProviderManager.authenticate(authentication)
  • ProviderManager将委托DaoAuthenticationProvider去认证

    • DaoAuthenticationProvider的authenticate方法是继承抽象父类AbstractUserDetailsAuthenticationProvider的
    • 在父类的authenticate方法中 调用子类覆写的抽象方法 retrieveUser通过UserDetailsService().loadUserByUsername获取UserDetails对象
    • 加载成功后调用子类覆写的抽象方法additionalAuthenticationChecks判断密码是否一致
    • 最后调用方法createSuccessAuthentication构建认证后的Authentication

    • 在这里会先调用DaoAuthenticationProvider的createSuccessAuthentication方法,判断是否需要升级密码,通过userDetailsPasswordService.updatePassword方法升级

    • 注意:retrieveUser、additionalAuthenticationChecks、createSuccessAuthentication在DaoAuthenticationProvider中均有覆写
  • 认证完成后返回Authentication
  • 在访问非登录请求时,可以通过请求携带的token获取UserDetails对象,然后构建已经认证的Authenticate,最后通过SecurityContextHolder.getContext().setAuthentication(authenticationToken);保存到上下文中,表示已经认证过了
  • 注意:构建已经认证的Authenticate一般通过UsernamePasswordAuthenticationToken生成




参与人数 1金币 +60 收起 理由
itjc8 + 60 赞一个!

查看全部评分总评分 : 金币 +60

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

本版积分规则