Spring webSecurity.ignoring() 不会忽略自定义过滤器

2022-09-02 23:01:55

我在我的Spring 4 MVC + Security + Boot项目中设置了一个自定义身份验证过滤器。过滤器做得很好,现在我想禁用某些URI的安全性(如)。这是我的配置:/api/**

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/api/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests()
                 .anyRequest().authenticated()
              .and()
                 .addFilterBefore(filter, BasicAuthenticationFilter.class);
    }
}

不幸的是,当我调用资源时,筛选器仍然是链接的。我已经添加了我的过滤器,并在每次调用时将其写入控制台。您知道我的配置出了什么问题吗?/api/...println

更新

筛选代码:

@Component
public class EAccessAuthenticationFilter extends RequestHeaderAuthenticationFilter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FILTER");
        if(SecurityContextHolder.getContext().getAuthentication() == null){
            //Do my authentication stuff
            PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(user, credential, authorities);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }  
        super.doFilter(request, response, chain);
     }

    @Override
    @Autowired
    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
        super.setAuthenticationManager(authenticationManager);
    }

}

答案 1

删除类 EAccessAuthenticationFilter 上的@Component,如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception {
   http.authorizeRequests()
             .anyRequest().authenticated()
          .and()
             .addFilterBefore(new EAccessAuthenticationFilter(), BasicAuthenticationFilter.class);
}

https://github.com/spring-projects/spring-security/issues/3958


答案 2

我没有足够的声誉来添加评论,但对于像我这样正在寻找对kimhom的答案进行更多解释的人来说,他们会告诉Spring Security忽略通过它添加的任何过滤器。然后过滤器仍然被调用,因为(或任何种类的)注释告诉Spring(再次)在安全链之外添加过滤器。因此,虽然过滤器在安全链中被忽略,但它并没有被另一个(非安全?)链忽略。WebSecurityConfigurerAdapter@Component@Bean

这为我解决了两周的头痛。在我的情况下,我的自定义过滤器需要由 where 给出的身份验证对象,它一直显示为 null,因为安全链从未执行过。SecurityContext


推荐