我通过AlanCookieFilter
注释定义了@Bean
:
@Bean
public Filter alanCookieFilter() {
return new AlanCookieFilter(); // type of AbstractPreAuthenticatedProcessingFilter
}
然后我使用WebSecurityConfigurerAdapter
添加了我的过滤器:
@Configuration
public class AlanOAuthWebConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(alanCookieFilter()).antMatcher("/**");
}
}
但是当我开始申请时,我收到了以下日志消息:
o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'alanCookieFilter' to: [/*]
AlanCookieFilter
似乎仍然映射到/*
而不是/**
。我完全对这种行为感到困惑。
答案 0 :(得分:2)
您添加了两次过滤器。第一次作为Servlet Filter
,第二次出现在Spring Security的filter chain中。
默认情况下,Spring Boot会将您的过滤器映射到/*
,请参阅Spring Boot Docs:
默认情况下,如果上下文仅包含一个Servlet,则它将映射到
/
。在多个Servlet bean的情况下,bean名称将用作路径前缀。过滤器将映射到/*
。如果基于约定的映射不够灵活,您可以使用
ServletRegistrationBean
和FilterRegistrationBean
类进行完全控制。如果bean实现了ServletContextInitializer
接口,您也可以直接注册项目。
要更改映射,请参阅:How to add a filter class in Spring Boot?
您应该只向过滤器链添加Spring Security过滤器(或扩展名),请参阅HttpSecurity.html#addFilter:
添加一个过滤器,该过滤器必须是安全框架中提供的过滤器的一个实例或扩展其中一个过滤器。
您的过滤器扩展AbstractPreAuthenticatedProcessingFilter
,只应添加到过滤器链中。
阻止Spring Boot映射过滤器的一种方法是:不要使用@Bean
公开过滤器,请参阅Spring Boot Docs。
使用嵌入式servlet容器时,可以直接将Servlet和Filters注册为Spring bean。