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

rat*_*tek 8 java spring spring-mvc spring-security

我在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我在/ api/...下调用资源时,过滤器仍然被链接.我在我的过滤器中添加了println,并在每次调用时将其写入控制台.你知道我的配置有什么问题吗?

UPDATE

过滤代码:

@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);
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 17

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

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

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

  • 另请检查您是否有 @Bean 注解的方法来创建 E...AuthenticationFilter 的实例。我有这样的方法,我猜Spring会自动将我的过滤器添加到其过滤器链中,而不是按照我想要的顺序。 (2认同)

小智 5

我没有足够的声誉来添加评论,但是对于像我这样想要为kimhom的答案提供更多解释的人,他WebSecurityConfigurerAdapter会告诉Spring Security忽略通过它添加的所有过滤器。过滤器随后仍被调用,因为注释@Component(或的任何形式@Bean)都通知Spring在安全链之外再次添加过滤器。因此,尽管在安全链中忽略了过滤器,但另一个(非安全性?)链并未忽略它。

这为我解决了两个星期的头痛。在我的情况下,我的自定义过滤器需要由SecurityContext哪里提供的Authentication对象,该对象一直显示为null,因为安全链从未执行过。


Ada*_*dam 0

我总是发现最简单的方法就是将此配置放入您的application.properties

security.ignored=/api/**
Run Code Online (Sandbox Code Playgroud)