前几天有粉丝私信我:WebSecurity和HttpSecurity是什么关系?当时问我,我大概只知道他们之间的关系类似于TypeScript和JavaScript的关系。但具体细节真的不清楚。所以我周末做了一些研究。HttpSecurity的本质前几天SpringSecurity5.4的新玩法引入了一种配置HttpSecurity的新方式:@BeanSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{returnhttp.antMatcher("/**").authorizeRequests(authorize->authorize.anyRequest().authenticated()).build();}其实可以知道HttpSecurity是用来构建一个过滤器SecurityFilterChain的,里面包含了一系列的过滤器链。通常,我们的配置围绕构建SecurityFilterChain。不得不拿出这张旧图:安全过滤器链从上图可以看出,构建的要交给FilterChainProxy来做代理。是不是有点没必要?很多时候我们可能需要配置多个SecurityFilterChains来实现多种访问控制策略。多个SecurityFilterChains为了精细化管理多个SecurityFilterChains的生命周期,需要有一个proxy来统一管理这些SecurityFilterChains。这就是WebSecurity的意义。websecurity的构建方法:@overrideprotectedfilterperformbuild()throwsexception{assert.state(!this.securityfilterchainbuilders.issempty.issempty((),(),(),()-ConfigurationthatextendsWebSecurityConfigurerAdapter."+"moreadvanceduserscaninvoke"+WebSecurity.class.getSimpleName()+".addSecurityFilterChainBuilderdirectly");//忽略请求数和httpscurity数构成过滤链集合大小intchainSize=this.ignoredRequests.size()+this.securityFilterChainBuilders.size();ListsecurityFilterChains=newArrayList<>(chainSize);//初始化过滤链集合中的忽略请求过滤链for(RequestMatcherignoredRequest:this.ignoredRequests){securityFilterChains.add(newDefaultSecurityFilterChain(ignoredRequest));}//初始化过滤链col中httpssecurity定义的过滤链选择(SecurityBuildersecurityFilterChainBuilder:this.securityFilterChainBuilders){securityFilterChains.add(securityFilterChainBuilder.build());}FilterChainProxyfilterChainProxy=newFilterChainProxy(securityFilterChains);if(this.httpFirewall!=null){//请申请防火墙filterChainProxy.setFirewall(this.httpFirewall);if(this.requestRejectedHandler!=null){//请求拒绝处理器filterChainProxy.setRequestRejectedHandler(this.requestRejectedHandler);}filterChainProxy.afterPropertiesSet();Filterresult=filterChainProxy;if(this.debugEnabled){this.logger.warn("\n\n"+"**********************************************************************\n"+"**********安全调试已启用。*************\n"+"********这可能包含敏感信息。*************\n"+"**********不要在生产系统中使用!***************\n"+"*********************************************************************\n\n");result=newDebugFilter(filterChainProxy);}this.postBuildAction.run();returnresult;}从上面的源码可以看出,WebSecurity是用来构建一个SpringBeanFilterChainProxy的,叫做springSecurityFilterChain。它的作用是定义那些忽略安全控制的请求,那些必须被安全控制的请求,并在适当的时候清除SecurityContext以避免内存泄漏,也可以用来定义请求防火墙和请求拒绝处理器。另外,我们这里还配置了SpringSeuciryDebug模式。同时,还有一个在其他文章中可能没有提到的作用。FilterChainProxy是SpringSecurity到Spring框架应用的唯一出口,然后在Spring的桥接代理DelegatingFilterProxy中与一个Servlet结合,形成Spring到Servlet系统的唯一出口。这隔离了SpringSecurity、Spring框架和ServletAPI。综上所述,我们其实可以认为WebSecurity是SpringSecurity唯一对外的出口,而HttpSecurity只是定义内部安全策略的方式;WebSecurity对标FilterChainProxy,而HttpSecurity对标SecurityFilterChain,它们的父类是AbstractConfiguredSecurityBuilder。掌握了这些,你就基本可以知道它们有什么区别了。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。