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()等,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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编程运行原理