【发布时间】:2018-03-17 16:19:14
【问题描述】:
我有一个在 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() 中的路径。谢谢。
【问题讨论】:
-
因为它是 Spring Boot 检测到的 bean 并将其添加到常规过滤器链中。由于
OncePerRequestFilter的扩展,它只会执行一次,基本上你的安全过滤器链中配置的条目什么都不做。要修复它,不要让它成为一个 bean 并自己连接依赖项。这样 Spring Boot 就不会检测到它,它只是 Spring Security 过滤器链的一部分,而不是常规的过滤器链。或者为过滤器添加一个FilterRegistrationBean,并将enabled设置为false,以防止它被自动注册。
标签: spring spring-mvc spring-boot spring-security