WebSecurityConfigurerAdapter的底层逻辑

WebSecurityConfigurerAdapter是一个抽象类,它实现了接口类WebSecurityConfigurer<WebSecurity>,自身实现了父类的configure(WebSecurity)抽象方法和init(WebSecurity)抽象方法。

它的功能包括:

(1)它是WebSecurity构造器的配置器,通过 init(B)configure(B)执行功能。WebSecurity是Filter构造器,通过build(O) 执行功能。执行顺序是build->beforeinit->init{getHttp()->authenticationManager()->configure(this.http)->postBuildAction()

}->beforeConfigure->configure->performBuild方法返回Filter对象(new出来的)

(2)它通过getHttp()构造DefaultSecurityFilterChain的构造器HttpSecurity。DefaultSecurityFilterChain包含一个Filters集合和一个RequestMatcher对象,该对象可以判断HttpServletRequest是否匹配。并使用configure(HttpSecurity http)方法实现配置http的访问权限为都可以访问,并且在http对象的配置器缓存池中加入formLogin配置器和httpBasic配置器。

(3)它自身还包含内部类密码编码器(LazyPasswordEncoder),身份验证管理器构造器(DefaultPasswordEncoderAuthenticationManagerBuilder),身份验证管理器代理(AuthenticationManagerDelegator),用户信息服务代理(UserDetailsServiceDelegator

(4)对httpSecurity做一些基本配置

 

具体的源码分析:

复制代码
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity> {
    private final Log logger;
    private ApplicationContext context;
    private ContentNegotiationStrategy contentNegotiationStrategy;
    private ObjectPostProcessor<Object> objectPostProcessor;
    private AuthenticationConfiguration authenticationConfiguration;
    private AuthenticationManagerBuilder authenticationBuilder;
    private AuthenticationManagerBuilder localConfigureAuthenticationBldr;
    private boolean disableLocalConfigureAuthenticationBldr;
    private boolean authenticationManagerInitialized;
    private AuthenticationManager authenticationManager;
    private AuthenticationTrustResolver trustResolver;
    private HttpSecurity http;
    private boolean disableDefaults;
复制代码


而WebSecurityConfigurer<WebSecurity>接口继承了SecurityConfigurer<Filter, B>这个接口,这个接口里有两个抽象方法init(B) configure(B)。B类为WebSecurity类,从方法名可见init初始化了WebSecurity对象,configure配置了WebSecurity对象。

再看父类接口WebSecurityConfigurer<T extends SecurityBuilder<Filter>>

public interface WebSecurityConfigurer<T extends SecurityBuilder<Filter>> extends SecurityConfigurer<Filter, T> {
}

它继承了 SecurityConfigurer<Filter, T> 这个接口,key的类型指定为Filter,value是泛型,同时也是SecurityBuilder<Filter>的子类。从泛型看出,WebSecurity是SecurityBuilder<Filter>的子类,也是个安全构造器。

public interface SecurityConfigurer<O, B extends SecurityBuilder<O>> {
    void init(B builder) throws Exception;

    void configure(B builder) throws Exception;
}

因此可见本质上是一个安全配置器,功能是初始化配置安全构造器SecurityBuilder<Filter>。

安全构造器的类结构是

public interface SecurityBuilder<O> {
    O build() throws Exception;
}

说明安全构造器是构造一个泛型对象。

init(),build(),dobuild(),performbuild()按顺序执行(在AbstractConfiguredSecurityBuilder里)

复制代码
protected final O doBuild() throws Exception {
        synchronized(this.configurers) {
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.INITIALIZING;
            this.beforeInit();
            this.init();
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.CONFIGURING;
            this.beforeConfigure();
            this.configure();
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.BUILDING;
            O result = this.performBuild();
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.BUILT;
            return result;
        }
    }
复制代码

 在Adapter里,可以增加基本的配置:

复制代码
  private void applyDefaultConfiguration(HttpSecurity http) throws Exception {
        http.csrf();
        http.addFilter(new WebAsyncManagerIntegrationFilter());
        http.exceptionHandling();
        http.headers();
        http.sessionManagement();
        http.securityContext();
        http.requestCache();
        http.anonymous();
        http.servletApi();
        http.apply(new DefaultLoginPageConfigurer());
        http.logout();
    }
复制代码

 

 

开发者可以继承WebSecurityConfigurerAdapter,重载configure()方法来重新配置一些类对象,例如configure(httpSecurity)里可以对httpSecurity做一些配置,比如http.csrf().disable()等,

posted @   IT知识生产小店铺  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示