SpringSecurity全局认证管理器构建流程

149 阅读2分钟

全局认证管理器构建流程

  • 首先是WebSecurityConfigurerAdapter在初始化HttpSecurity的时候会创建全局认证管理器
  • 然后就是看有没有重写configure(AuthenticationManagerBuilder auth) 方法,来决定是靠认证配置类来创建认证管理器(AuthenticationConfiguration),还是靠用户自己在全局认证管理器构建器中设置的值来创建认证管理器
  • 走没有重写认证管理器(AuthenticationConfiguration)逻辑,可以看到这个全局认证管理器构建器有三个默认配置类
  • 这个三个默认配置类也是在AuthenticationConfiguration中初始化的,分别是
    • EnableGlobalAuthenticationAutowiredConfigurer:拿到容器中加载标注了@EnableGlobalAuthentication的Bean
    • InitializeAuthenticationProviderBeanManagerConfigurer:初始化全局的认证提供者
    • InitializeUserDetailsBeanManagerConfigurer:初始化用户详情服务
  • 然后开始执行遍历执行authBuilder.apply方法,就是将配置类添加到构建器的configurers
  • 然后开始执行authBuilder.build(),进行构建,流程就是执行beforeInit(),init(),beforeConfigure(),configure(),performBuild();这五个方法
  • beforeInit(()是空方法,然后执行init方法(),就是 对于传入的配置类执行init方法,第二个for循环是在构建器在初始化的时候传入的配置类
    • 第一个配置类EnableGlobalAuthenticationAutowiredConfigurer的init方法没干嘛
    • 第二个配置类InitializeAuthenticationProviderBeanManagerConfigurer是给configurers中添加了一个InitializeAuthenticationProviderManagerConfigurer
    • 第三个配置InitializeUserDetailsBeanManagerConfigurer是给configurers中添加了一个InitializeUserDetailsMana ****gerConfigurer
    • 由于此时构建器是初始化的状态,所以新增的两个配置类不仅仅是在configurers中,也在configurersAddedInInitializing中了,但是新增的这两个配置类的init是空方法
  • beforeConfigure()是空方法,configure方法中可以看到有5个配置类了
  • 前三个配置类的configure方法都是空方法,也就说只有后面新增的两个配置类起了效果
    • 第四个配置类InitializeAuthenticationProviderManagerConfigurer:这个类的作用就是看容器中有没有认证提供者,有就放入这个构建器的认证提供者集合中
    • 第五个配置类:InitializeUserDetailsBeanManagerConfigurer:可以看出就是添加一个认证提供者(DaoAuthenticationProvider),这也是一个针对于表单登录的认证提供者,也让项目有了保底的认证提供者
      • auth.isConfigured()方法是如果有了已经有了认证提供者就不会加入新的了
  • performBuild():
    • 就是创建全局认证管理器,注意此时是全局认证管理器,parentAuthenticationManager是空的
    • 然后设置认证成功是否擦除密码标志位
    • 设置消息推送器:后面认证成功会发送认证成功等等的消息,
    • 执行后置方法:此时objectPostProcessor只是一个AutowireBeanFactoryObjectPostProcessor,是为了让这个全局认证管理器注入到容器中
  • 至此全局认证管理器构建完毕