在 Security Filter Chain 中自定义 Filter

1、概览

本文将带你了解如何在 Spring Security Filter Chain(过滤器链)中定义一个自定义过 Filter(过滤器)。

2、创建 Filter

Spring Security 默认提供了许多 Filter,这些 Filter 在大多数情况下已经足够。

当然,有时也需要在链中创建一个新的 Filter 来实现新功能。

首先,可以实现 org.springframework.web.filter.GenericFilterBean

GenericFilterBean 是一个简单的 javax.servlet.Filter 实现,它还实现了一系列的 Aware 接口,可以感知到 Spring 容器中的一些组件。

只需实现一个方法:

public class CustomFilter extends GenericFilterBean {

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }
}

3、在 Security Config 中配置 Filter

可以通过 XML 或 Java 配置把 Filter 配置到 Spring Security Filter Chain 中。

3.1、Java 配置

创建 SecurityFilterChain Bean,以编程式注册 Filter。

例如,与 HttpSecurity 实例上的 addFilterAfter 方法配合使用:

@Configuration
public class CustomWebSecurityConfigurerAdapter {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.addFilterAfter(
          new CustomFilter(), BasicAuthenticationFilter.class);
        return http.build();
    }
}

有几个方法:

3.2、XML 配置

可以使用 custom-filter 标签来指定 Filter 在过滤器链中的位置。

例如,通过 after 属性来指定放在哪个 Filter 后面:

<http>
    <custom-filter after="BASIC_AUTH_FILTER" ref="myFilter" />
</http>

<beans:bean id="myFilter" class="com.baeldung.security.filter.CustomFilter"/>

以下是所有属性,用于指定 Filter 在链中的具体位置:

  • after:描述了在自定义 Filter 放置在链中的哪个过滤器之后。
  • before:定义了 Filter 应放在哪个过滤器之前
  • position:允许用自定义 Filter 替换显式位置(索引)上的标准 Filter

4、总结

本文介绍了如何自定义 Spring Security Filter 以及如何将其配置到 Spring Security Filter Chain 中。


Ref:https://www.baeldung.com/spring-security-custom-filter