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项目中找到。