收起左侧

[JAVA] SpringSecurity认证流程

0
回复
580
查看
[复制链接]
avatar
  • TA的每日心情
    qdsmile慵懒
    2023-11-3 14:24
  • 签到天数: 13 天

    [LV.3]偶尔看看

    1

    主题

    9

    帖子

    70

    积分

    发表于 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 收起 理由
    avatar itjc8 + 60 赞一个!

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

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

    本版积分规则