• springSecurity认证逻辑调用链源码挖掘


    对应版本为5.7.2,不同版本间可能有或大或小的差异,整体思想应该大同小异。
    先看总结出来的下图

    在这里插入图片描述
    在前面的内容我们提到,springSecurity是通过一系列的过滤器组成的过滤器链来实现的,而认证对应的UsernamePasswordAuthenticationFilter就是springSecurity核心的一环。
    下面我们再从源码一步一步看具体的实现。

    UsernamePasswordAuthenticationFilter

    在idea中双击Shift键,搜索并键入AbstractAuthenticationProcessingFilter

    UsernamePasswordAuthenticationFilter
    AbstractAuthenticationProcessingFilter类中没有Filter的入口doFilter,在父类AbstractAuthenticationProcessingFilter中。

    在这里插入图片描述
    UsernamePasswordAuthenticationFilter中重写了attemptAuthentication方法,将用户名密码封装成UsernamePasswordAuthenticationToken对象再调用ProviderManager的authenticate认证。

    在这里插入图片描述

    ProviderManager

    ProviderManager实现了AuthenticationManager接口,根据接口的描述,该接口验证会进行身份验证,返回用户身份信息以及被授予的权限。
    在这里插入图片描述
    在ProviderManager实现的authenticate中,遍历容器中的AuthenticationProvider,如果返回的result不为空则代表认证通过,再封装并返回认证信息。

    在这里插入图片描述

    DaoAuthenticationProvider

    通过idea的提示信息,AuthenticationProvider的实现类中无法直接找到DaoAuthenticationProvider,后者是通过继承AbstractUserDetailsAuthenticationProvider,间接实现了AuthenticationProvider接口。

    AuthenticationProvider实现类
    我们先看下面这段AbstractUserDetailsAuthenticationProvider中实现的逻辑

    在这里插入图片描述
    先通过this.userCache.getUserFromCache(username)查询用户信息,如果查询不到,再通过retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication)来match,实际debug发现是通过后者找到的,而后面这个方法是由DaoAuthenticationProvider实现的。

    在这里插入图片描述

    InMemoryUserDetailsManager

    InMemoryUserDetailsManager的逻辑就比较简单了,实现了UserDetailsService接口,含有成员属性private final Map users = new HashMap<>(),初始化的用户名密码信息就包含其中,其中key为username。

    在这里插入图片描述

    总结

    最后再回顾一下文章开头贴出的调用链路图可能会更加清晰一丢丢。

    在这里插入图片描述
    整体来看可以分为三部分

    • 一个是入口的Filter,UsernamePasswordAuthenticationFilter作为过滤器链的一环,提供了认证逻辑的入口;
    • ProviderManager提供了各个Provider来匹配并认证,直到有能够匹配上并认证通过有返回认证结果;
    • 最后就是Provider提供的认证逻辑了,这部分有默认的,也可以自由发挥自己注入,方便项目中重写个性化的认证逻辑。
  • 相关阅读:
    山东大学2024深度学习期末考试回忆
    前端学习之HTML
    spring之mvc中@RequestMapping注解具有什么功能呢?
    5G 室内融合定位白皮书
    昇思25天学习打卡营第8天|保存与加载
    【C++20】模块
    33个常用JavaScript功能已封装成方法
    项目训练营第四天
    MacBook电脑垃圾清理软件CleanMyMac X4.18
    C++ 正则表达式使用
  • 原文地址:https://blog.csdn.net/qq_41885819/article/details/126705431