在 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();
}
}
有几个方法:
addFilterBefore(filter, class)
在指定 Filter 类的位置前添加 Filter。addFilterAfter(filter, class)
在指定 Filter 类的位置后添加 Filter。addFilterAt(filter, class)
在指定 Filter 类的位置添加 Filter。addFilter(filter)
添加一个 Filter,该 Filter 必须是 Spring Security 提供的 Filter 的实例或继承之一。
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