伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

Spring Security 实战干货:5.4版本带来的新玩法

来源:本站原创 浏览:244次 时间:2021-05-05
1. 前言

在以往Spring Security的教程中我们自定义配置都是声明一个配置类WebSecurityConfigurerAdapter,然后覆写(@Override)对应的几个方法就行了。然而这一切在Spring Security 5.4开始就得到了改变,从Spring Security 5.4 起我们不需要继承WebSecurityConfigurerAdapter就可以配置HttpSecurity 了。相关的说明原文:

  • Remove need for WebSecurityConfigurerAdapter #8805
  • Configure HTTP Security without extending WebSecurityConfigurerAdapter #8804

发稿时最新的Spring Security版本为5.4.5。

2. 新的配置方式

旧的配置方式目前依然有效:

@Configuration
static class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Override
 protected void configure(HttpSecurity http) throws Exception {
  http
   .antMatcher("/**")
   .authorizeRequests(authorize -> authorize
     .anyRequest().authenticated()
   );
 }
}

5.4.x版本我们有新的选择:

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 return http
   .antMatcher("/**")
   .authorizeRequests(authorize -> authorize
     .anyRequest().authenticated()
   )
   .build();
}

这种JavaConfig的方式看起来更加清爽舒服,而且和适配器解耦了。等等我好像发现了新的东西,上面filterChain方法的参数是HttpSecurity类型。熟悉@Bean注解的同学应该会意识到一定有一个HttpSecurity类型的Spring Bean。没错!就在HttpSecurityConfiguration中有一个这样的Bean:

@Bean({"org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity"})
@Scope("prototype")
HttpSecurity httpSecurity() throws Exception {
    // 省略掉
    return http;
}

初始化的内容已经忽略掉,它不是本文关注的重点。我们注意到HttpSecurity@Scope("prototype")标记。也就是这个HttpSecurity Bean不是单https://www.3tt.net/?mod=artinfo&aid=348例的,每一次请求都会构造一个新的实例。这个设定非常方便我们构建多个互相没有太多关联的SecurityFilterChain,进而能在一个安全体系中构建相互隔离的安全策略。比如后端管理平台用Session模式,前台应用端用Token模式。   多个SecurityFilterChain 

3. 原理

Spring Security 有一个名为springSecurityFilterChain默认的过滤器链类(实际位置就是上图的 Bean Filter位置),其类型为FilterChainProxy, 它代理了所有的SecurityFilterChain,关键的代理注入代码:

for (SecurityFilterChain securityFilterChain : this.securityFilterChains) {
   this.webSecurity.addSecurityFilterChainBuilder(() -> securityFilterChain);
   for (Filter filter : securityFilterChain.getFilters()) {
      if (filter instanceof FilterSecurityInterceptor) {
         this.webSecurity.securityInterceptor((FilterSecurityInterceptor) filter);
         break;
      }
   }
}

那么this.securityFilterChains来自哪里呢?

@Autowired(required = false)
void setFilterChains(List<SecurityFilterChain> securityFilterChains) {
   securityFilterChains.sort(AnnotationAwareOrderComparator.INSTANCE);
   this.securityFilterChains = securityFilterChains;
}

到这里就一目了然了吧,SecurityFilterChain类型的Bean会被加载到this.securityFilterChains中。如果你的Spring Security 版本升级到 5.4.x,就可以尝试一下这种方式。

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net