1. 概述

在这个简短教程中,我们将关注如何为Spring Security过滤器链编写自定义过滤器。

2. 创建过滤器

Spring Security默认提供了一系列过滤器,大多数情况下已经足够使用。

然而,在某些情况下,确实需要通过创建新的过滤器来实现新功能。

我们首先实现[org.springframework.web.filter.GenericFilterBean](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/GenericFilterBean.html)

GenericFilterBean是一个简单的javax.servlet.Filter实现,它对Spring有感知。

我们只需要实现一个方法:

public class CustomFilter extends GenericFilterBean {

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

3. 在安全配置中使用过滤器

我们可以自由选择XML配置或Java配置,将过滤器集成到Spring Security配置中。

3.1. Java配置

我们可以通过创建[SecurityFilterChain](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/web/SecurityFilterChain.html) bean来程序性地注册过滤器。

例如,可以使用HttpSecurity实例的addFilterAfter方法:

@Configuration
public class CustomWebSecurityConfigurerAdapter {

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

可用的方法有:

  • addFilterBefore(filter, class):在指定过滤器类的位置之前添加一个过滤器。
  • addFilterAfter(filter, class):在指定过滤器类的位置之后添加一个过滤器。
  • addFilterAt(filter, class):在指定过滤器类的位置插入一个过滤器。
  • addFilter(filter):添加一个过滤器,它必须是Spring Security提供的过滤器的实例或扩展。

3.2. XML配置

我们可以使用custom-filter标签以及这些名称之一来将过滤器添加到链中,指定过滤器的位置。例如,可以使用after属性指明:

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

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

以下是所有属性,用于精确指定我们在过滤器栈中的位置:

  • after:描述自定义过滤器将被放置在哪个标准过滤器之后。
  • before:定义我们的过滤器应放置在哪个过滤器之前。
  • position:允许用自定义过滤器替换明确位置的标准过滤器。

4. 总结

在这篇简短的文章中,我们创建了一个自定义过滤器,并将其接入Spring Security过滤器链。

如往常一样,所有代码示例都可以在样例GitHub项目中找到。