我有一个自定义过滤器,该过滤器在BasicAuthenticationFilter之前调用,该Bean是自动连接到SecurityConfig文件中的。
.addFilterBefore(preAuthTenantContextInitializerFilter, BasicAuthenticationFilter.class)
这是过滤器的外观。
@Component public class PreAuthTenantContextInitializerFilter extends OncePerRequestFilter { @Autowired private TenantService tenantService; ..... .....
我希望此过滤器不会像Spring Security过滤器链的其余部分那样触发,该其余部分用于WebSecurityConfigurerAdapter#configure(WebSecurity web)web.ignoring()中包含的路径。
这是它的样子
@Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**","/swagger-resources/configuration/ui", "/swagger-ui.html", "/docs/**"); } }
我已经尝试过的。
从过滤器类中删除@Component批注,这只会阻止过滤器在任何情况下都无法调用,因为该过滤器不再被选作bean,并且永远不会进入过滤器链。
我在寻找什么
我希望在调用Spring Security链的其余部分时调用此过滤器,并像在其他Spring Security过滤器中一样在web.ignoring()中忽略路径。谢谢。
任何Servlet,Filter或Servlet *Listener实例,它是一个Spring bean将与嵌入容器注册。如果要application.properties在配置过程中引用一个值,这将特别方便。
Servlet
Filter
Servlet *Listener
application.properties
该摘录来自Spring Boot 参考指南。基本上Filter,在应用程序上下文中检测到的所有内容都将注册到默认过滤器链中,并映射到DispatcherServlet或/。
DispatcherServlet
/
在您的情况下,由于过滤器被标记为@Component它将是Bean,因此Spring Boot会检测到is并将其注册到嵌入式容器中。但是,您不希望仅将其包含在Spring Security过滤器链中。
@Component
为此,您有2个选项。
@Autowired
FilterRegistrationBean
enabled
false
Herer是选项2的解决方案:
@Bean public FilterRegistrationBean preAuthTenantContextInitializerFilterRegistration(PreAuthTenantContextInitializerFilter filter) { FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.setEnabled(false); return registration; }
有了这个添加的bean,Spring Boot将不会在嵌入式容器中注册过滤器,因此,它将仅作为Spring Security过滤器链的一部分被调用。