Spring Security 实战攻略:WebSecurity和HttpSecurity的关系

为了精细化的管理多个SecurityFilterChain的生命周期,搞一个统一管理这些SecurityFilterChain的代理就十分必要了,这就是WebSecurity的意义。下面是WebSecurity的build方法的底层逻辑:


  1. @Override 
  2. protected Filter performBuild() throws Exception { 
  3.    Assert.state(!this.securityFilterChainBuilders.isEmpty(), 
  4.          () -> "At least one SecurityBuilder<? extends SecurityFilterChain> needs to be specified. " 
  5.                + "Typically this is done by exposing a SecurityFilterChain bean " 
  6.                + "or by adding a @Configuration that extends WebSecurityConfigurerAdapter. " 
  7.                + "More advanced users can invoke " + WebSecurity.class.getSimpleName() 
  8.                + ".addSecurityFilterChainBuilder directly"); 
  9.     // 被忽略请求的个数 和 httpscurity的个数 构成了过滤器链集合的大小 
  10.    int chainSize = this.ignoredRequests.size() + this.securityFilterChainBuilders.size(); 
  11.    List<SecurityFilterChain> securityFilterChains = new ArrayList<>(chainSize); 
  12.     // 初始化过滤器链集合中的 忽略请求过滤器链     
  13.     for (RequestMatcher ignoredRequest : this.ignoredRequests) { 
  14.       securityFilterChains.add(new DefaultSecurityFilterChain(ignoredRequest)); 
  15.    } 
  16.     // 初始化过滤器链集合中的 httpsecurity定义的过滤器链 
  17.    for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) { 
  18.       securityFilterChains.add(securityFilterChainBuilder.build()); 
  19.    } 
  20.    FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains); 
  21.    if (this.httpFirewall != null) { 
  22.        // 请求防火墙 
  23.       filterChainProxy.setFirewall(this.httpFirewall); 
  24.    } 
  25.    if (this.requestRejectedHandler != null) { 
  26.        // 请求拒绝处理器 
  27.       filterChainProxy.setRequestRejectedHandler(this.requestRejectedHandler); 
  28.    } 
  29.    filterChainProxy.afterPropertiesSet(); 
  30.  
  31.    Filter result = filterChainProxy; 
  32.    if (this.debugEnabled) { 
  33.       this.logger.warn("\n\n" + "********************************************************************\n" 
  34.             + "**********        Security debugging is enabled.       *************\n" 
  35.             + "**********    This may include sensitive information.  *************\n" 
  36.             + "**********      Do not use in a production system!     *************\n" 
  37.             + "********************************************************************\n\n"); 
  38.       result = new DebugFilter(filterChainProxy); 
  39.    } 
  40.    this.postBuildAction.run(); 
  41.    return result; 

从上面中的源码可以看出,WebSecurity用来构建一个名为springSecurityFilterChain的Spring BeanFilterChainProxy 。它的作用是来定义那些请求忽略安全控制,那些请求必须安全控制,在合适的时候清除SecurityContext以避免内存泄漏,同时也可以用来定义请求防火墙和请求拒绝处理器,另外我们开启Spring Seuciry Debug模式也是这里配置的。

同时还有一个作用可能是其它文章没有提及的,FilterChainProxy是Spring Security对Spring framework应用的唯一出口,然后通过它与一个Servlet在Spring的桥接代理DelegatingFilterProxy结合构成Spring对Servlet体系的唯一出口。这样就将Spring Security、Spring framework、Servlet API三者隔离了起来。

总结

我们事实上可以认为,WebSecurity是Spring Security对外的唯一出口,而HttpSecurity只是内部安全策略的定义方式;WebSecurity对标FilterChainProxy,而HttpSecurity则对标SecurityFilterChain,另外它们的父类都是AbstractConfiguredSecurityBuilder。掌握了这些基本上你就能知道它们之间的区别是什么了。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章